2016-12-22 21 views
3

2つのモデルがあります。書籍著者です。ブックモデルは、著者を取得するための関係を定義していますクエリ結果の関係を個別にロードする

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

私たちは2000年に出版された本のすべてを取得したい場合は、その作者と一緒に、私たちはこれを行うことができます:

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

今では2000年に出版されたユニークな著者をと別々に返信したい場合、どうすればいいですか?ボブが3冊の本を出版し、サリーが2冊の本を出版したとしよう。著者がいない5冊の本と、ボブとサリーをそれぞれ1回ずつ含むコレクションが1つあります。

これは(これは単純化した例であり、タイプミスを含んでいてもよい)、私が得ている最も近い:

$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?

答えて

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(); 
+0

ああ私が思っていたものとは違う方向に向かっている。私はそれが好きです! – user45623

2

あなたは2000年に本を書いた著者のIDを取得したい場合は、あなたがwhereHas()を使用することができます。

Author::whereHas('books', function($q) { 
     $q->where('publication_year', 2000); 
    })->pluck('id'); 
関連する問題