简体   繁体   English

分组时的 Laravel 查询生成器

[英]Laravel query builder when grouping

I've started with Laravel for a week now and something bother me about the Query Builder and the when clause.我已经开始使用 Laravel 一周了,查询生成器和when子句让我感到困扰。

I'm using it like so:我这样使用它:

$query->when($filters['full-time'] ?? false, fn ($query) =>
  $query->where('contract_type', JobPositionsEnum::class::FullTime)
);
      
$query->when($filters['location'] ?? false, fn ($query, $location) =>
  $query->where('location', 'like', '%' . $location . '%')
);

$query->when($filters['search'] ?? false, fn ($query, $params) => 
  $query->where('position', 'like', '%' . $params . '%')
    ->orWhere('description', 'like', '%' . $params . '%')
    ->orWhereHas('company', function ($query) use ($params) {
      $query->where('name', 'like', '%'.$params.'%');
    })
);

With this query I was hoping received an SQL request looking like this:通过这个查询,我希望收到一个如下所示的 SQL 请求:

SELECT * FROM `jobs` 
WHERE `contract_type` = 'Full time' 
AND `location` like '%United%'
AND (`position` like '%S%' or `description` like '%S%' or EXISTS (SELECT * FROM `companies` WHERE `jobs`.`company_id` = `companies`.`id` and `name` like '%S%'))

But instead I'm receiving this:但相反,我收到了这个:

SELECT * FROM `jobs` 
WHERE (
  `contract_type` = 'Full time' and 
  `location` like '%United%' and 
  `position` like '%S%' or `description` like '%S%' or EXISTS (
    SELECT * FROM 
      `companies` 
       WHERE `jobs`.`company_id` = `companies`.`id` 
       and `name` like '%S%'
   )
) 

I'm not sure to understand why the when group my query when I don't want to, did you know what I'm missing here?我不确定为什么when我不想时将我的查询分组,你知道我在这里缺少什么吗?

You should use an additional where to group the or conditions.您应该使用额外的whereor条件进行分组。

Your last when should look like this:你最后的时间应该是这样的:

$query->when($filters['search'] ?? false, function ($query) use ($params) {
    $query->where(function ($query) use ($params) {
        $query->where('position', 'like', '%' . $params . '%')
            ->orWhere('description', 'like', '%' . $params . '%')
            ->orWhereHas('company', function ($query) use ($params) {
                $query->where('name', 'like', '%' . $params . '%');
            });
    });
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM