【发布时间】:2017-09-21 21:04:05
【问题描述】:
我有两张桌子,书籍和章节。一本书有很多章节。
图书模型:
public function chapters() {
return $this->hasMany(Chapter::class);
}
章节模型:
public function book() {
return $this->belongsTo(Book::class);
}
我想使用这样的单个查询来获取带有自己最新章节的书单:
$books = Book::with(['authors', 'categories', 'chapters' => function($q) {
$q->orderBy('updated_at', 'desc')->first();
}]->get();
但它不起作用。章节返回一个空数组。如果我在子查询中删除 first(),它可以正常工作。
有没有办法只用一个查询来做到这一点。我不想获取所有相关章节然后保留一个或使用多个查询。我感觉更好的唯一方法是使用 join,对吗?
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
不,Eloquent 就足够了。使用
limit()或者看看here 怎么样。您需要做的是将$q->orderBy('updated_at', 'desc')限制为1。 -
一本书可能有超过 5k 的章节,我应该把它们都拿下来吗,内存问题?
-
您需要将查询限制到一行。
-
我试过了,但它对空结果不起作用。
-
@Alex 您不能将
limit添加到急切加载的关系中。假设你有 10 本书,每本书有 10 章(共 100 章)。如果将limit(1)添加到预先加载的chapters关系中,这将使关系查询总共获取 1 章,而不是每本书 1 章。
标签: laravel join eloquent relationship