首页 > 解决方案 > Laravel 查询 groubBy 条件

问题描述

我有一个 dB 查询,我groupBy()只想在满足条件而不使用union因为pagination. 不幸的是groupBy(),似乎只有在循环外的整个查询上调用时才有效。

这是为从$filterArr. 根据数组,我需要从表的不同列中进行选择。
$key=='pattern'我需要来自其列的不同结果时。

查询看起来像这样

select `col_1`, `col_2`, `col_3` 
from `mytable` 
where (`color` LIKE ? or `pattern` LIKE ? or `style` LIKE ?)
group by `col_2` //<< i need this only for 'pattern' above and not the entire query

继承人的模型:

// $filterArr example
// Array ( [color] => grey [pattern] => stripe ) 

$query = DB::table('mytable');
$query = $query->select(array('col_1', 'col_2', 'col_3'), DB::raw('count(*) as total'));

$query = $query->where(function($query) use ($filterArr){
  $ii = 0;
  foreach ($filterArr as $key => $value) {
    if ($key=='color'){
      $column = 'color';
    }else if ($key=='style'){
      $column = 'style';
    }else if ($key=='pattern'){
      $column = 'pattern';
      $query = $query->groupBy('col_2'); // << !! does not work
    }

    if($ii==0){
      $query = $query->where($column, 'LIKE', '%'.$value.'%');
    }
    else{
      $query = $query->orWhere($column, 'LIKE', '%'.$value.'%'); 
    }

    $ii++;
  }
});

$query = $query->orderBy('col_2', 'asc')->simplePaginate(30);  

标签: laraveleloquent

解决方案


我认为您可以稍微简化代码:

$query = DB::table('mytable');
$query = $query->select(array('col_1', 'col_2', 'col_3'), DB::raw('count(*) as total'));

$query = $query->where(
   collect($filterArr)
      ->only(['color','style','pattern'])
      ->map(function ($value, $key) {
          return [ $key, 'like', '%'.$value.'%', 'OR' ];
      })->all()
)->when(array_key_exists('pattern', $filterArr), function ($query) {
   return $query->groupBy('col_2');
});

$query = $query->orderBy('col_2', 'asc')->simplePaginate(30);  

推荐阅读