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

标签 php mysql laravel eloquent

我正在尝试研究如何使用用户输入动态创建 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/

相关文章:

php - 在 Twitter Bootstrap 类中使用 "action"

php - 格式化 MySQL 查询的结果,就好像它是从控制台运行的一样

mysql - 如何获取表中具有多个匹配行值的行数?

Laravel 5.5 - Mailgun 捕获电子邮件错误

javascript - 捕获按Print Screen的用户并提交用户IP、论坛名称、成员(member)ID和URL

MySQL:尽可能删除重复行

mysql查询插入日期列小于10时的选择限制

javascript - Laravel:如何在 JavaScript 中使用 Laravel Blade?

php - 如何在 Laravel 中动态创建子域?

php - MySQL+PHP 可以使用 SELECT AS 重新定义表名吗?