2016-10-29 10 views
1

は私のクエリです:2つのネストされたWHERE句を使用していますか?ここ

$first = DB::table('news') 
     ->selectRaw('"news" as tableName, id, title, description, imgPath') 
     ->where(function($query) use ($q) { 
      $query->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q)); 
     }); 

    $results = DB::table('productions') 
     ->selectRaw('"productions" as tableName, id, title, description, imgPath') 
     ->where(function($query) use ($q) { 
      $query->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q)); 
     }) 
     ->unionAll($first) 
     ->get(); 

見ての通り、where()があるともそれでwhereRaw()がある...それは正しいでしょうか?

結果は大丈夫です。予想通りです。パフォーマンスが心配です。あなたは知っている、私は1つだけwhere()でそれを行うことができると思います。しかし現在でもうまくいきますが、データセットが巨大であれば怖いので、遅くなるかもしれません。

とにかく、私のコードは良いですか?

+0

paginate()機能を使用するように助言しますなぜ1つの条件に対してのみクロージャを使用するのですか。しかし、それは同じSQLクエリを構築するので、SQLのパフォーマンスの点では重要ではありません。 –

答えて

0

where()クロージャー内にシングルを追加する必要はありません。あなたはそれとしてもせずに、あなたのコードを書くことができます。

$first = DB::table('news') 
    ->selectRaw('"news" as tableName, id, title, description, imgPath') 
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q)); 

$results = DB::table('productions') 
    ->selectRaw('"productions" as tableName, id, title, description, imgPath') 
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)", array($q)); 
    ->unionAll($first) 
    ->get(); 

しかし、データセットは、その後巨大になったときに、あなたが本当にパフォーマンスについて懸念している場合、私はあなたが私にはわからない代わりにget()

0

特に機能面では間違っているとは言いがたいですが、あなたが解決できるものがあります。 selectRawを実行しているので、テーブルのエイリアスができますが、エイリアスは決して使用していません。

$first = DB::table('news') 
    ->select(['id', 'title', 'description', 'imgPath']) 
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)"); 

$results = DB::table('productions') 
    ->select(['id', 'title', 'description', 'imgPath']) 
    ->whereRaw("MATCH(title,description) AGAINST(? IN BOOLEAN MODE)") 
    ->unionAll($first) 
    ->get(); 

上記を試しても問題が解決しない場合は、selectRawステートメントをselectステートメントに置き換えてください。

+0

テーブルエイリアスではなく、テーブル名を含む列です。 –

+0

あなたは正しいです、申し訳ありません。この場合、selectステートメントは ' - > select(['id'、 'title'、 'description'、 'imgPath'、 'news'])'と同じであるが、 'production'私はあなたの実装について完全には分かっていませんが、 'news'や 'productions'という属性が 'tableName'よりも読みやすくなる可能性が最も高いです。しかし、 'tableName'と呼ぶように設定している場合は、もう一度機能性を確認してください。何の問題もないはずです。 –

+0

申し訳ありません、それは動作しません。 DBは 'news'テーブルから' news'カラムを選択し、 'productions'テーブルから' productions'カラムを選択しようとします。しかし、これらの列はおそらく存在しません。 OPが望んでいるのは、行がどのテーブルから来るのかに依存して、 'news'と 'productions'というハードコードされた値を持つ 'tableName'列です。 –

関連する問題