web-dev-qa-db-ja.com

Laravel belongsToManyのいずれにもないもの

私は2つのテーブルcategoriesvideosを持っています。それから、これらはbelongsToMany関係なので、これらのピボットテーブルを持っています。

私がやろうとしていることは、ビデオの単一のインスタンスが多くのカテゴリーの1つに含まれていないすべてのビデオを取得することです。

例えば.

  • 動画1はカテゴリ1、2、3にあります。
  • ビデオ2はカテゴリ1および3にあります。
  • 動画3はカテゴリ1です。

カテゴリ2または3にないビデオを取得したいのですが、これによりビデオ3が返されます。

これまでに試したところ、意図した結果が得られません。これは、カテゴリ1にあるため、ビデオ1と2には別の行がまだ見つかっているためです。

Video::whereHas('categories', function($query) {
    $query->whereNotIn('category_id', [2,3]);
})->take(25)->get();

これから読み込まれるクエリは次のとおりです。

select * from `videos` where exists (select * from `categories` inner join 
`category_video` on `categories`.`id` = `category_video`.`category_id` where 
`videos`.`id` = `category_video`.`video_id` and `category_id` != ? and 
`category_id` != ? and `categories`.`deleted_at` is null) and `videos`.`deleted_at` 
is null order by `created_at` desc limit 25
8
Karl

EloquentのwhereDoesntHave()制約を使用して、必要なものを取得できます。

// get all Videos that don't belong to category 2 and 3
Video::whereDoesntHave('categories', function($query) {
  $query->whereIn('id', [2, 3]);
})->get();
6
jedrzej.kurylo