Laravel自动使用急切加载设置反向关系

3
假设我有一个用户和书籍之间的hasMany关系,如下所示:
class User extends Model {
    public function books()
    {
        return $this->hasMany(Book::class);
    }
}

class Book extends Model {
    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

如果我想要预加载所有用户及其书籍,代码会是这样的:
$users = User::with('books')->get();

这意味着只进行了2个查询:
  1. 获取所有用户
  2. 获取这些用户拥有的所有书籍
这意味着如果我执行以下操作,则不会执行其他查询:
$users[0]->books[0]

然而,即使结果已知,在返回反向时仍会执行额外的查询:
$users[0]->books[0]->user

有没有一种方法可以自动设置反向关系,而不需要进行另一个查询?

哇,不要使用$users[0]->books[0]这样的写法,我知道它可能有ArrayAccess接口,所以你可以像操作数组一样使用它,但它是一个集合,请习惯使用first()last()等方法...按照Laravel的方式来做吧...希望你不会真的使用那种语法,只是为了演示而已... - undefined
1
是的,这只是为了演示目的。 - undefined
太棒了!你吓死我了。 - undefined
没有什么比使用数组语法访问集合更加恶魔化的了... - undefined
如果你明确想要第三个项目,那么你的逻辑有些问题,为什么会有1、2、3、4等等,却只想要第三个?只需从数据库中获取第三个并完成操作即可...否则你将需要遍历所有项目。 - undefined
显示剩余4条评论
1个回答

0
你可以使用嵌套预加载
$users = User::with('books','books.user')->get();

通过这样做,当你调用例如$users[0]->books[0]->user时,就不再需要查询数据库了。

这个是不是做了三个查询而不是两个? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接