分别加载查询结果的关系

时间:2016-12-22 21:18:43

标签: laravel laravel-5

假设我们有两个模型 Book 作者。 Book模型定义了一个获取作者的关系:

public function author()
{
    return $this->belongsTo(Author::class, 'author_id','id');
}

如果我们想要获得2000年出版的所有书籍以及他们的作者,我们可以这样做:

$books = Book::with('author')->where('publication_year', 2000)->get();

现在,如果我们想要从他们的图书中返回2000年单独发布的独特作者,该怎么办?让我们说鲍勃出版了三本书,莎莉出版了两本书。我们有一个集合,其中包括没有作者的5本书,以及另外一个包括Bob和Sally的集合。

这是我最接近的(这是一个简化的例子,可能包含拼写错误):

$books = Book::with('author')->where('publication_year', 2000)->get();
$authors = $books->pluck('author')->unique('id');
//this part is bad:
foreach ($books as $book) {
    unset($book['author']);
}

有更有效的方法吗,还是我必须设置手动JOIN?

2 个答案:

答案 0 :(得分:2)

如果你想获得2000年写过书籍的作者的身份证,你可以使用whereHas()

Author::whereHas('books', function($q) {
        $q->where('publication_year', 2000);
    })->pluck('id');

答案 1 :(得分:1)

您可以将whereIn用作:

$books = Book::where('publication_year', 2000)->get();

$authors_id = $books->unique('author_id')->pluck('author_id');

$authors = Author::whereIn('id', $authors_id)->get();