代码之家  ›  专栏  ›  技术社区  ›  Success Man

为什么只在拉瓦夫雄辩的“一组接一组”的领域工作?

  •  0
  • Success Man  · 技术社区  · 6 年前

    我的剧本拉勒维雄辩地说:

    $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') ,它起作用了。没有错误

    如果 $参数 array('description'=>'test') 存在错误: Unknown column 'description' in 'having clause'

    我试过表中的所有字段。只有数字字段有效。显然是因为数字字段是分组的

    如果使用 having ?

    2 回复  |  直到 6 年前
        1
  •  1
  •   rkj    6 年前

    这个 HAVING 子句用于 SELECT 语句为一组行或聚合指定筛选条件。这个 之后执行的条款 选择 ,所以如果你申请 在不在的列上 group by 或不在 aggregate 函数,则它将作为where工作,这是没有用的,因为select子句已被执行。我认为仅仅是因为那雄辩的口才可能会引发例外,尽管不确定。

    你能做什么,检查你的 param 钥匙是否在 分组依据 然后应用字段,如果没有,则将其添加为 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

        2
  •  0
  •   Stratadox    6 年前

    这是因为Laravel雄辩的ORM是活跃的记录灵感和非常以数据库为中心。

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

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