実現したいこと
- 多対多のNOT検索をしたい
前提
laravelで多対多のテーブルにおいての検索機能を実装しています。
articlesテーブル
id | name |
---|---|
1 | aaa |
2 | bbb |
3 | ccc |
tagsテーブル
id | name |
---|---|
1 | AAA |
2 | BBB |
3 | CCC |
4 | DDD |
5 | EEE |
article_tagテーブル
article_id | tag_id |
---|---|
1 | 1 |
1 | 2 |
2 | 1 |
2 | 3 |
2 | 4 |
3 | 5 |
発生している問題・エラーメッセージ
php
1$query = Article::query(); 2$query->wherehas('tags',function ($q){ 3 return $q->whereIn('tag.id', [1,3]); 4});
この場合、問題なく記事1,2が取得されます。
しかし、上のnot検索をするため(※タグ1or3をもたない記事を検索)、whereInをwhereNotInにすると「記事1,2,3」すべてが取得されてしまいます
php
1$query = Article::query(); 2$query->wherehas('tags',function ($q){ 3 return $q->whereNotIn('tag.id', [1,3]); 4});
試したこと
$q->whereNotIn('tag.id', [1,3]);
この部分でそれぞれの記事に結び付くタグid2,4,5が引っ掛かっているのだろうと推測は付くのですがうまい回避方法が分かりません。
無理してwherehasといったリレーションのメソッドを使うのが間違いなのかも意見をお聞きしたいです。(個人的には折角のリレーションを生かしきれないのがもったいないと思ってます)
php
1$query = Article::query(); 2$query->whereNotIn('id',function ($q){ 3 $q->select('article_id')->from('article_tag')->whereIn('tag_id', [1,3]); 4});
