mysql - Laravel 和 MySql 中的多重搜索问题

标签 mysql laravel search

我在 laravel 的方法中实现多重搜索时遇到问题,我有如下代码

$search_fields = ['name', 'symbol'];

$searchValues = preg_split('/\s+/', $request->q, -1, PREG_SPLIT_NO_EMPTY);

$query = function ($q) use ($searchValues, $search_fields) {
    foreach ($searchValues as $value) {
        foreach ($search_fields as $field){
      $q->where($field, 'like', "%{$value}%")
      ->orWhere($field, 'like', "%{$value}%");}
      ;}};


return $products = Product::where($query)->orderBy('name', 'asc')->take(100)->get(); 

但它不起作用,因为生成这样的sql:

select
*
from
  `products`
where
(
  `name` like "%261%"
  or `name` like "%261%"
  and `symbol` like "%261%"
  or `symbol` like "%261%"
)
order by
  `name` asc
limit
100 

我需要像下面这样,但我不知道如何在 Laravel 中做到这一点:(

select
*
from
 `products`
where
(
  `name` like "%hp%"
  or `symbol` like "%hp%")
  and (`name` like "%261%"
  or `symbol` like "%261%"
)
order by
  `name` asc
limit
100 

最佳答案

您需要将括号之间的 where 分组到闭包中。所以你的 $query 函数应该像这样更新:

$query = function ($q) use ($searchValues, $search_fields) {
    foreach ($searchValues as $value) {
        foreach ($search_fields as $field) {
            $q->where(function ($query) use ($field, $value) {
                $query
                    ->orWhere($field, 'like', "%{$value}%")
                    ->orWhere($field, 'like', "%{$value}%");    
            });
        }
    }
};

这让查询生成器知道要将哪些哪里放在一起。

关于mysql - Laravel 和 MySql 中的多重搜索问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54311662/

相关文章:

php - 如何使用append方法在#posts div中显示属于点击类别的帖子?

javascript - 从数组中获取元素直到条件匹配

ruby-on-rails - 太阳黑子和高级关联搜索

php - 提交表单在数据库中添加空行

php - 服务器终端中的 mySQL,需要查看输出

java - hibernate DAO 错误

php - Laravel 5.3 将 html 添加到 MailMessage->line

javascript - 我如何在 Angular 4中使用刷新 token

spring - 使用 jquery 和 spring mvc 进行即时搜索

mysql 从 docker 退出(1)