laravel - 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);
解决方案
我认为您可以稍微简化代码:
$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);
推荐阅读
- java - java - 如何从SpringBoot,Java中的另一个模块调用类
- java - 多线程:不正确的更改值
- php - 为在 wordpress 中不起作用的管理员通知添加操作
- java - 如何使用 CompletableFuture 异步调用 restTemplate
- reactjs - Next.js 带路由的多步表单
- c# - 如何根据结果提供颜色编码的解释?
- css - 我已经这段代码工作了,但问题是访问者在 vieport 之前加载时看不到打字效果。我在 elementor 中使用它
- javascript - 关于 discord.js V13 启动所有 Intents
- transactions - 如何回滚 asyncpg 事务
- flutter - Flutter 错误尝试将名称更正为现有方法的名称,或定义名为“ancestorStateOfType”的方法