假设我们有两个模型 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?
答案 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();