murakamidesu
@murakamidesu

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Eloquentでの複数条件検索

Eloquentのリレーションで複数条件検索

LaravelのEloquent?のクエリビルダにてリレーションを用いたテーブルの結合を行っています。

発生している問題・エラー

 仮にブログアプリを開発していて、userテーブルとpostテーブルを結合しているとしましょう。
 問題は、結合元のuserテーブルにはwhere句が効くのですが、postテーブルにはwhere句が効きません。

該当するソースコード

 実際のコードから一部変更しています。
カラムA、Bはuser、postテーブル両方にあるものとします。

$result = User::where('columnA', $columnA) 
             ->where('columnB', true)
             ->whereHas('Post', function($query) use ($columnA) {
                       $query->where('columnA', "{$columnA}") 
                             ->where('columnB', true);
           })->with('Post')
             ->get();

自分で試したこと

実行される前のSQL文を画面に出力すると、inner joinなどではなく、exists句が使用されており、postテーブルに対するwhere句が効いていませんでした。
 言葉足らずなしつもんですが、有識者の方いらっしゃいましたら回答お願いいたします。

0

2Answer

どんなクエリが発行されて欲しいか記載がないのでコードについての指摘はできませんが、
whereHasを使用しているのでEXISTS句が使用されているではないでしょうか?

0Like

Comments

  1. @murakamidesu

    Questioner

    おっしゃるとおりです。

    Exists句以降のSQL文が()で囲われており、サブクエリになっているようです。
    そのサブクエリをデバッグするとwhere句が途中で消えてしまい、例のコードで言うところのpostテーブルに条件がかからないです。

現状SQLがどうなっていて、理想としてはどのようなSQLができて欲しいがないので、現状どうなっていてどうしたいのかがわからないので追記した方が良いかと。
どこを直せば良いかがこれだと分からないです。

0Like

Comments

  1. @murakamidesu

    Questioner

    現状

    select * from User where columnA = $columnA and columnB = true EXISTS (select * from Post where columnA = $columnA and columnB = true);
    

    デバックした後のSQL文

    select * from User where columnA = $columnA and columnB = true EXISTS (select * from Post);
    

    のようになっておりサブクエリ内のwhere句が消えてから実行されているようです。

    理想

    select * from User where columnA = $columnA and columnB = true EXISTS (select * from Post where columnA = $columnA and columnB = true);
    

    このSQL文が実行される。

Your answer might help someone💌