2016-12-12 15 views
0

基本的に私はLaravelでtihsクエリを作成したいが、うまくいきません。今、私が欲しいLaravel。 WHERENOTINの使用

$films_with_actors = DB::table('films') 
     ->join('actor_film', 'actor_film.film_id', '=', 'films.id') 
     ->join('actors', 'actors.id', '=', 'actor_film.actor_id') 
     ->select('films.id') 
     ->groupBy('films.id') 
     ->get(); 

: 最初のものは、少なくとも役者はこのように関連付けられているデータベース内のすべての映画を得る:「whereNotIn」私はこれらの2つのクエリを書かれている使用

SELECT films.id, films.name AS film 
FROM films 
WHERE films.id NOT IN 
( 
    SELECT films.id 
    FROM actors, actor_film, films 
    WHERE actors.id = actor_film.actor_id 
    AND actor_film.film_id = films.id 
    GROUP BY films.id 
) 
ORDER BY films.id DESC 
LIMIT 600 
; 

俳優と関係のない映画を手に入れよう。そのために、前の方法に含まれていないIDを取得しようとしています。

$films_with_no_actors = DB::table('films') 
     ->whereNotIn('films.id', $films_with_actors) 
     ->orderBy('films.id', 'desc') 
     ->take(500) 
     ->get(); 
     - 

助けてください。

答えて

2

共有したコードに基づいて基本的な解決策を提供しています。

laravelには、特定のキーのすべての値を持つ配列を取得するためのpluckというメソッドがあります。

したがって、$ films_with_actorsのIDのみ取得できます。 (あなたの最初のクエリに基づいて)のようなもの:

$films_with_actors = DB::table('films') 
    ->join('actor_film', 'actor_film.film_id', '=', 'films.id') 
    ->join('actors', 'actors.id', '=', 'actor_film.actor_id') 
    ->select('films.id') 
    ->groupBy('films.id') 
    ->pluck('id')->toArray(); 

今、あなたはIDの配列を持っていて、2番目のクエリのwhereNotIn句でその配列含めることができます。

$films_with_no_actors = DB::table('films') 
    ->whereNotIn('films.id', $films_with_actors) 
    ->orderBy('films.id', 'desc') 
    ->take(500) 
    ->get(); 
+0

感謝を。しかし、それは私が2つのquerysを実行する必要があるということですか? MySQLのように、一方を他方の内部に組み込むことはできませんか? –

+0

最初のクエリを作成した後に呼び出すことができます。 $ films_with_actors_ids = $ films_with_actors-> pluck( 'id') - > toArray();のようなことをします。 –

関連する問題