为什么“拥有”只在雄辩的laravel上对“分组依据”的字段起作用?

时间:2018-09-16 17:25:50

标签: laravel eloquent laravel-5.6 having

我的脚本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是动态的。它可以改变

如果$paramarray('number'=>'1234'),则可以使用。没有错误

如果$paramarray('description'=>'test'),则存在错误:Unknown column 'description' in 'having clause'

我尝试了表格项目中的所有字段。仅数字字段有效。显然是因为数字字段是分组依据

如果使用having,如何使items表中的所有字段都起作用?

2 个答案:

答案 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语言问题的补丁。