質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

954閲覧

laravelで多対多のNOT検索をしたい

h_e_llo

総合スコア13

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2023/05/02 17:32

編集2023/05/02 17:48

実現したいこと

  • 多対多のNOT検索をしたい

前提

laravelで多対多のテーブルにおいての検索機能を実装しています。

articlesテーブル

idname
1aaa
2bbb
3ccc

tagsテーブル

idname
1AAA
2BBB
3CCC
4DDD
5EEE

article_tagテーブル

article_idtag_id
11
12
21
23
24
35

発生している問題・エラーメッセージ

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});

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2023/05/02 17:42

テーブルの構造とサンプルデータを提示してください。
guest

回答1

0

やりたいことはtag idが1または3であるタグを持たない記事を求めたいのだと思いますが、whereNotInに置き換えると、tag idが1でも3でもないタグを(少なくともひとつ)持つ記事という意味になってしまいます。

存在しないリレーションのクエリで説明されているwhereHasの否定のwhereDoesntHaveを使えばいいでしょう。

php

1$query = Article::query(); 2$query->whereDoesntHave('tags',function ($q){ 3 return $q->whereIn('tag.id', [1,3]); 4});
> App\Models\Article::whereDoesntHave('tags', fn($q) => $q->whereIn('tag.id', [1,3]))->get() = Illuminate\Database\Eloquent\Collection {#6213 all: [ App\Models\Article {#7166 id: 3, name: "ccc", created_at: "2023-05-06 11:25:24", updated_at: "2023-05-06 11:25:24", }, ], }

投稿2023/05/06 11:42

編集2023/05/06 11:46
crhg

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問