我正在尝试研究如何使用用户输入动态创建 Eloquent 查询,该查询会根据输入的长度更改查询。直接使用 MySQL 这很简单……只需根据用户输入连接一个查询字符串。使用 Eloquent 是不可能的,除非您 a) 使用“原始”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]
最佳答案
您可以将循环中的所有 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 结果。
关于php - 使用未知数量的参数创建 Laravel Eloquent Query,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38841973/