我试图找出如何创建一个雄辩的查询动态使用用户输入改变查询取决于输入的长度。直接使用MySQL很简单…只需根据用户输入连接查询字符串。使用Eloquent是不可能的,除非你a)使用一个"原始的"sql查询,这违背了使用Eloquent的目的,或者b)使用eval()函数这样非常不健康的东西。
如何遍历未知长度的用户输入并创建一个Eloquent查询,该查询使用"OR"answers"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
's分组到"parent"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结果。