为什么`have`只能在laravel雄辩的“group by”字段上工作?

问题描述 投票:0回答:2

我的脚本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表中的所有字段都有效?

laravel eloquent laravel-5.6 having
2个回答
1
投票

HAVING子句在SELECT语句中用于指定一组行或聚合的过滤条件。在HAVING之后执行的SELECT子句,所以如果你在HAVING函数中不在group by中的列上应用aggregate那么它将在where中工作,这是没有用的,因为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


0
投票

这是因为Laravel的Eloquent ORM受到了活跃记录的启发,并且以数据库为中心。

最后,主要是因为having is an sql concept用于过滤聚合结果中的行。

简而言之,您正在处理SQL语言中的问题补丁,而Eloquent ORM并没有将其抽象出来。

© www.soinside.com 2019 - 2024. All rights reserved.