Laravel Eloquent 查询与关系

多才多艺的

在 Laravel 环境(v 5.7)中,我有两个表:电影版本在模型中定义的一对多关系中相关,如下所示:

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

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

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

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

一切正常,除了返回的电影始终是整个记录集的第一个,而不是我之前从数据库加载版本的父版本

我试图检索所有与:

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

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

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

先感谢您。

多才多艺的

我发现了这个问题...

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

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

$model->relationship() //with parenthesis

返回关系的一个实例您将方法作为方法调用,并且对于 Eloquent 模型类而言,它“充当强大的查询构建器”并“提供强大的方法链和查询功能”(请参阅此处)。

否则,如果你打电话:

$model->relationship //without parenthesis

您可以直接获得Collection实例通过这种方式,您可以将方法作为属性调用并获取Laravel 集合,从而让您在集合上循环、获取记录(模型)属性并使用 Collection 类的所有方法。

所以,就我而言,写

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章