2016-11-08 11 views
0

ユーザーがフォームで検索入力をフィルタリングするためにlaravelビルダを適用しましたが、最適ではありません。以下のビルダーが行われるカスタムクエリ検索form search functionalitylaravel Builderでの生のSQLステートメント

最初の入力でされています

私のフォームは次のようになります。これは私のシナリオです。

return $builder->where('city', 'LIKE', '%' . $value . '%') 
        ->orWhere('first_name', 'LIKE', '%' . $value . '%') 
        ->orWhere('middle_name', 'LIKE', '%' . $value . '%') 
        ->orWhere('last_name', 'LIKE', '%' . $value . '%'); 

3ドロップダウンメニューのは、次のコードによってフィルタリングされています

return $builder->where('location', $value); // <-- for "selecteer locatie" 
return $builder->where('level', $value); // <-- for "selecteer richting" 
return $builder->where('graduation', $value); // <-- for "selecteer diplomajaar" 

$値は、ユーザの入力です。

3つのドロップダウンオプションでフィルタするたびに、それは魔法として機能します。私はそれを最初のフィルタのクエリと組み合わせようとすると、実際に望む以上に多くの結果を示します。

したがって、最初のクエリではORステートメントが出されており、実際はそのバグです。私は

('statement')これらの記号間に

"WHERE `city` LIKE %" . $value . "% 
OR `first_name` LIKE %" . $value . " 
OR `middle_name` LIKE %" . $value . " 
OR `last_name` LIKE %" . $value . " 

を実行することができますビルダーでRAW SQLステートメントを配置したい私は別にビルダーを実行することができる方法またはどのように私は入力Aすることができる方法はありますlaravel 5.3ビルダーの未加工SQLステートメント?

詳細が必要な場合は、お尋ねください。

編集:私の質問は十分に明確ではありません。以下の説明を参照してください。

私のフォームにSQLフィルタを作成するためにBuilderクラスを使用しています。

+wheres: array:7 [▼ 
0 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "city" 
    "operator" => "LIKE" 
    "value" => "%hof%" 
    "boolean" => "and" 
] 
1 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "first_name" 
    "operator" => "LIKE" 
    "value" => "%hof%" 
    "boolean" => "or" 
] 
2 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "middle_name" 
    "operator" => "LIKE" 
    "value" => "%hof%" 
    "boolean" => "or" 
] 
3 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "last_name" 
    "operator" => "LIKE" 
    "value" => "%hof%" 
    "boolean" => "or" 
] 
4 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "location" 
    "operator" => "=" 
    "value" => "Franeker" 
    "boolean" => "and" 
] 
5 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "level" 
    "operator" => "=" 
    "value" => "MAVO" 
    "boolean" => "and" 
] 
6 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "graduation" 
    "operator" => "=" 
    "value" => "1992" 
    "boolean" => "and" 
] 
] 

私はcityと比較するため、OR演算子を使用していますので、first_namemiddle_nameか:私は、高度な検索を実行すると、私のビルダーをダンプするたびに、私は+句に次の配列を持つビルダーオブジェクトを取得しますlast_name、私は4 where where 7の代わりにを得ているはずです。これは、Builderが最初の入力で呼び出されたORステートメントをANDステートメントとみなすために発生します。このように

return $builder->where('city', 'LIKE', '%' . $value . '%') 
        ->orWhere('first_name', 'LIKE', '%' . $value . '%') 
        ->orWhere('middle_name', 'LIKE', '%' . $value . '%') 
        ->orWhere('last_name', 'LIKE', '%' . $value . '%'); 

答えて

1

私はこれを交換することによってそれを解決

return $builder->where(function($query) use ($value){ 

    $query->where('city', 'LIKE', '%' . $value . '%') 
      ->orWhere('first_name', 'LIKE', '%' . $value . '%') 
      ->orWhere('middle_name', 'LIKE', '%' . $value . '%') 
      ->orWhere('last_name', 'LIKE', '%' . $value . '%'); 
}); 

EDIT:以下+句がダンプするとき、ダイとビルダクラス

をダンプされます
+wheres: array:4 [▼ 
0 => array:3 [▼ 
    "type" => "Nested" 
    "query" => Builder {#216 ▶} 
    "boolean" => "and" 
] 
1 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "location" 
    "operator" => "=" 
    "value" => "Franeker" 
    "boolean" => "and" 
] 
2 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "level" 
    "operator" => "=" 
    "value" => "MAVO" 
    "boolean" => "and" 
] 
3 => array:5 [▼ 
    "type" => "Basic" 
    "column" => "graduation" 
    "operator" => "=" 
    "value" => "1992" 
    "boolean" => "and" 
] 
] 

配列索引0のネストされたBuilderクラスには、挿入されたOR文があります。

0

あなたの答えは、自分で正しく塊をグループ化する必要があります。

「Laravel 5.3ビルダーで生のSQL文をどのように入力できますか?

DB::statement($rawStatement) 

あなたはstatementの2番目のパラメータとして値をバインドしていることを確認し、あなたも

DB::statement(DB::raw($rawStatement)) 

を使用することができます

いくつかのクエリを入力するのに有用であるだろうができ
$query->whereRaw("city LIKE %{$value}%") 

もありますネストされたクエリの問題を解決しません。

あなたはの線に沿って何かをしなければならないのwheres生の全て作りたい場合:

$query->whereRaw($mainQuery) 
->setBindings([$city, $first_name, $middle_name, $last_name]) 

メインクエリがどのように見えるところ:

"(city LIKE ? OR first_name LIKE ? OR middle_name LIKE ? OR last_name LIKE ?)" 

次に、あなたがあなたのを追加することができますその文字列への生フィルタリングされたクエリ

"AND location = ?" 
関連する問題