使用未知数量的参数创建Laravel Eloquent Query

时间:2016-08-09 04:17:54

标签: php mysql laravel eloquent

我正在尝试使用用户输入动态创建Eloquent查询,该用户输入根据输入的长度更改查询。使用直接MySQL这很简单......只需根据用户输入连接查询字符串。使用不可能的Eloquent,除非你要么a)使用'raw'sql查询,这会破坏使用Eloquent的目的,或者b)使用像eval()函数那样高度不健康的东西。

如何迭代未知长度的用户输入并创建一个Eloquent查询,使用“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中的一个查询中可以完成的操作来说似乎非常麻烦。

我正在尝试做的传统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]

1 个答案:

答案 0 :(得分: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结果。