Почему «иметь» работает только с полями, которые «сгруппированы» в красноречивом laravel? - PullRequest
0 голосов
/ 16 сентября 2018

Мой сценарий 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?

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Предложение 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);
    }
}

Вы можете проверить здесь ГДЕ ПРОТИВ ЕГО

0 голосов
/ 17 сентября 2018

Это потому, что Eloquent ORM от Laravel основан на активных записях и ориентирован на базу данных.

В конце концов, это в основном потому, что having - это концепция sql , которая используется для фильтрации строкв совокупности результатов.

Короче говоря, вы имеете дело с исправлениями проблем в языке SQL, которые Eloquent ORM не удалил.

...