Запрос со столбцом whereHas и sum of relationship


Запрос со столбцом whereHas и sum of relationship

28.09.2020 10:30:24 Просмотров 45 Источник

У меня есть запрос на добавление пользовательского столбца "баланс" с использованием суммы значений в таблице отношений.

User::withCount(['transactions as balance' => function($query) {
     $query->select(\DB::raw('sum(credit_movement)'));
}]);

Это прекрасно работает для возврата столбца "баланс".


Теперь я хочу отфильтровать пользователей относительно столбца "баланс".

->where('balance', '<', 0);

Если я свяжу его с запросом, он не будет работать, так как столбец "баланс" не существует.

User::withCount(['transactions as balance' => function($query) {
     $query->select(\DB::raw('sum(credit_movement)'));
}])
->where('balance', '<', 0);

Я попробовал использовать

User::withCount(['transactions as balance' => function($query) {
     $query->select(\DB::raw('sum(credit_movement)'));
}])
->having('balance', '<', 0); // won't work

// also:
->havingRaw('balance < 0'); // won't work

Но ничего из этого не работает.

Неизвестный столбец "баланс" в предложении "наличие"

Я хочу, чтобы запрос возвращал только тех пользователей, у которых баланс меньше 0. (и я хочу добиться этого в построителе запросов, а не в коллекции ->filter().


Обновление:

Я попытался использовать whereHas(), но не смог написать его правильно

User::withCount(['transactions as balance' => function($query) {
     $query->select(\DB::raw('sum(credit_movement)'));
}])
   ->whereHas('transactions', function($q) {
      $q->whereRaw('sum(credit_movement), < ?', 0);
   });

Синтаксическая ошибка или нарушение доступа: 1064 у вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует вашей версии сервера MySQL для правильного синтаксиса для использования рядом' )

У вопроса есть решение - Посмотреть?

Ответы - Запрос со столбцом whereHas и sum of relationship / Query with whereHas and sum of relationship column

Является ответом!
senty

29.09.2020 02:53:23

Наконец-то он заработал:

User::whereHas('transactions', function($q) {
   $q->select(\DB::raw('SUM(credit_movement) as balance'))
       ->havingRaw('balance < 0');
   });
});
Помочь в развитии проекта:
Закрыть X