我的脚本laravel像这样雄辩:
$query = $this->item->select('a.*','b.attribute_code')
->from('items as a')
->join('attr_maps as b','b.number','=','a.number')
->groupBy('a.number');
foreach($param as $key => $value) {
$query = $query->having($key, '=', $value);
}
$query = $query->paginate(10);
我的$ param是动态的。它可以改变
如果$param
是array('number'=>'1234')
,则可以使用。没有错误
如果$param
是array('description'=>'test')
,则存在错误:Unknown column 'description' in 'having clause'
我尝试了表格项目中的所有字段。仅数字字段有效。显然是因为数字字段是分组依据
如果使用having
,如何使items表中的所有字段都起作用?
答案 0 :(得分:1)
HAVING
语句中使用SELECT
子句为一组行或集合指定过滤条件。 HAVING
子句在SELECT
之后执行,因此,如果将HAVING
应用于不在group by
或不在aggregate
函数中的列,则它将在,这是没有用的,因为select子句已经执行。而且我认为仅仅是因为这种雄辩,可能会引发异常,但是不确定。
您可以做的是,检查param
项是否在group by
字段中,然后应用(如果没有的话)将其添加为where
这样的条件。
$query = $this->item->select('a.*','b.attribute_code')
->from('items as a')
->join('attr_maps as b','b.number','=','a.number')
->groupBy('a.number');
foreach($param as $key => $value) {
if($key== 'number'){
$query = $query->having($key, '=', $value);
}else{
$query = $query->where($key, '=', $value);
}
}
您可以在这里WHERE vs HAVING
答案 1 :(得分:0)
这是因为Laravel的Eloquent ORM受活动记录启发并且非常以数据库为中心。
最后,主要是因为having
is an sql concept用于过滤汇总结果中的行。
简而言之,您正在处理Eloquent ORM尚未抽象出来的SQL语言问题的补丁。