Laravel Query Builder SUM с предложением where - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть следующие отношения: У элементов много записей (Recordss.item_id ссылается на Items.id) .

У меня нормально работает этот запрос:

$items = Item::addSelect(['quantity_sum' => Record::selectRaw('sum(quantity) as total')
                                ->whereColumn('item_id', 'items.id')
                                ->groupBy('item_id')
                             ])
                    ->get();

Но мне нужно получить только элементы, у которых сумма records.quantity меньше единицы. Я пытался добавить -> где ('amount_sum', '1') , но получаю следующее сообщение об ошибке:

SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец «amount_sum» в «where clause» (SQL: выберите items. *, (Выберите сумму (количество) как общее от records где item_id = items. id сгруппировать по item_id) как quantity_sum из items, где quantity_sum = 1)

Почему я не могу использовать псевдоним количества_
Как отфильтровать только элементы, сумма которых в столбце Records.quantity меньше 1?

Ответы [ 2 ]

1 голос
/ 13 апреля 2020

Вы должны использовать HAVING

Примерно так:

->havingRaw('sum(quantity) > ?', [1])

Редактировать:

$items = Item::addSelect(['quantity_sum' => Record::selectRaw('sum(quantity) as total')->whereColumn('item_id', 'items.id')->groupBy('item_id')])
    ->havingRaw('quantity_sum < ?', [1])
    ->groupBy('items.id') 
    ->get();
0 голосов
/ 13 апреля 2020

Вы должны определить отношение между Предметом и Моделями Записи следующим образом:

в Модели Изделия:

public function records()
{
return $this->hasMany(Record::class,'item_id');
}

в Модели Записи:

public function item()
{
return $this->belongsTo(Item::class,'item_id');
}

и просто в вашем запросе используйте «doesntHave» следующим образом:

$itemsWithoutRecords= Item::doesntHave('records')->get();

, и если вам нравится метод count, вы можете использовать withCount, например:

$itemsWithoutRecords= Item::withCount('records')->having('records_count','<',1)-> get();

обратите внимание: оба способа необходимо исправить отношение между моделями

первый путь: https://laravel.com/docs/7.x/eloquent-relationships#querying -отношение-отсутствие

второй путь: https://laravel.com/docs/7.x/eloquent-relationships#counting -связанные модели

...