在 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] 删除。
我来说两句