2016-08-09 12 views
4

入力の長さに応じてクエリを変更するユーザ入力を使用して動的にEloquentクエリを作成する方法を試しています。これは単純なMySQLを使用して簡単です...ちょうどユーザーの入力に基づいてクエリ文字列を連結します。 Eloquentを使用する目的を破る「生の」SQLクエリを使用するか、b)eval()関数のような非常に不健全なものを使用しない限り、Eloquentを使用することは不可能です。パラメータの数が不明なLaravel Eloquent Queryの作成

どのようにして、未知の長さのユーザの入力を反復処理と「OR」の組み合わせを使用して、単語の複数のフィールドを検索雄弁クエリを作成することができますし、「AND」

は実際に働くことができない次の擬似コードを考えてみましょう。

$search = "cat sat on the mat"; 
$searchWords = explode(' ', $search); 

$data['finds'] = DB::table('mytable') [... incomplete query] 


foreach ($searchWords as $word) { 
    ->where('firstname', 'like', '%' . $word . '%') 
    ->orWhere('lastname', 'like', '%' . $word . '%') 
    ->orWhere('address', 'like', '%' . $word . '%')->AND [... next word] 
} 

これは単純に未処理クエリを使用していないかどうかです。私は各単語ごとに別々のクエリを実行し、PHPを使って結果をマージ/操作することができますが、これは伝統的なMySQLの1つのクエリでできることは非常に面倒です。

私が何をしようとしているため、従来のMySQLのクエリは次のようになります。

SELECT * FROM `mytable` 
WHERE (firstame LIKE '%$cat%' OR lastname LIKE '%cat%' OR address LIKE '%cat%') 
AND (firstname LIKE '%sat% OR lastname LIKE '%sat%' OR address LIKE '%sat%') 
AND [etc, etc, for all words in user input] 
+0

私は自然検索に「マッチする」と考えることをお勧めします。あなたは何をしようとしているのですか?私は悪いデザイン/解決策だと思っています –

+0

@ fred2この質問はもう助けが必要ですか? – Alphonsus

+0

@Alphonsus - 私はあなたの答えは完璧でなければならないと思う、ありがとう – fred2

答えて

1

あなたはできる 『親』 where内部ループ内のグループのすべてのwhere年代。

$ query = DB :: table( 'mytable');

foreach ($searchWords as $word) { 
    $query->where(function ($query) use ($word) 
    { 
     $query->orWhere('firstname', 'like', '%' . $word . '%'); 
     $query->orWhere('lastname', 'like', '%' . $word . '%'); 
     $query->orWhere('address', 'like', '%' . $word . '%'); 
    }); 
} 

$results = $query->get(); 

これにより、目的のSQLクエリーと同様の結果が得られます。 $query->toSql()を印刷すると、未処理のSQL結果を確認できます。

関連する問題