【问题标题】:Laravel Eloquent query with relationLaravel Eloquent 查询与关系
【发布时间】:2020-04-04 08:45:31
【问题描述】:

在 Laravel 环境 (v 5.7) 中,我有两个表:filmsversions 在模型中定义的一对多关系中相关:

class Film extends Model {
    ...
    public function versions() {
        return $this->hasMany(Version::class);
    }
}
class Version extends Model {
    ...
    public function film() {
        return $this->belongsTo(Film::class);
    }
}

我想选择一个电影的随机版本及其相关的父电影,所以在控制器中我这样做:

...
use App\Film;
use App\Version;

class HomeController extends Controller {
    ...
    public function index() {
        $rndVersion = Version::inRandomOrder()->first();
        $relatedFilm = $rndVersion->film->first();

一切正常,除了 返回的 film 始终是整个记录集的第一个,而不是我之前加载的 version 的父级来自数据库。

我已尝试将所有内容与以下内容一起检索:

$rndVersion = Version::inRandomOrder()->with('film')->first();

它可以工作,但它会将所有内容打包在一个存储在 $rndVersion 中的对象中,我宁愿将这两个东西分开。

那么,我做错了什么? 我一般应该怎么做才能获得选定/加载的父记录?

提前谢谢你。

【问题讨论】:

    标签: relationship one-to-many laravel-5.7 eloquent-relationship


    【解决方案1】:

    我发现了问题...

    调用Model中定义的关系方法的方式会改变返回的结果。

    一般来说,如果你打电话:

    $model->relationship() //with parenthesis
    

    返回一个关系实例。您将方法作为方法调用,并且与 Eloquent 模型类一样,它“充当强大的查询构建器”并“提供强大的方法链接和查询功能”(see here)。

    否则如果你打电话:

    $model->relationship //without parenthesis
    

    您会直接获得一个集合的实例。这样您就可以将方法作为属性调用并获得Laravel Collection,从而让您循环收集、获取记录(模型)属性并使用 Collection 类的所有方法。

    所以,就我而言,写作

    $rndVersione = Version::inRandomOrder()->first();
    $rndFilm = $rndVersione->film()->first(); //film() WITH parenthesis
    

    有效,我猜是因为 first() 方法作为方法在关系上被调用,因此保持查询构建的正确性。

    【讨论】:

      猜你喜欢
      • 2021-05-25
      • 2013-10-03
      • 2017-07-19
      • 2021-09-25
      • 2015-01-21
      • 2017-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-09-05
      相关资源
      最近更新 更多