Laravel雄辩获得最新一行相关表格

时间:2017-04-25 02:39:18

标签: laravel join eloquent relationship

我有两个表,书籍章节。一本书有很多章节。

书籍型号:

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(),它可以正常工作。

有没有办法只用一个查询来做到这一点。我不希望得到所有相关的章节,然后保留一个,或使用多个查询。我感觉更好的唯一方法是使用加入,是不是?

任何帮助将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:7)

由于关系是单独的查询,因此无法为急切加载的关系添加限制。如果这样做,这会限制整个关系查询,它不会作为每个相关对象的限制。

幸运的是,您的要求可以通过额外的关系实现:

public function latestChapter() {
    return $this->hasOne(Chapter::class)->latest();
}

现在,您可以急切加载新的chapters关系,而不是急切地加载整个latestChapter关系。

$books = Book::with(['authors', 'categories', 'latestChapter'])->get();

答案 1 :(得分:0)

我知道这是一个旧帖子,但有一些新的解决方案,我想与您分享。 在 Laravel 8 中,有新的辅助函数:latestOfMany、oldestOfMany 和 ofMany。 对于您的示例,您可以使用:

public function latestChapter() {
    return $this->hasOne(Chapter::class)->latestOfMany();
}