我正在尝试使用用户输入动态创建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]
答案 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结果。