Eloquent: получить все строки, в которых значение столбца (x) существует более чем в одной строке (SQL DB) - PullRequest
0 голосов
/ 01 февраля 2020

Я хочу выполнить следующий необработанный запрос SQL в Eloquent Laravel:

SELECT distinct user_id FROM order_payment WHERE user_id IN (SELECT user_id FROM order_payment where payment_status = 'paid' GROUP BY user_id HAVING COUNT(*) > 1);

здесь я использую where in со свойством user_id, например что все строки в одной и той же таблице (order_payment), имеющие payment_status=paid и сгруппированные по свойству user_id, имеющие count > 1, выбраны и, наконец, мы выбираем distinct user_ids из заданного набора идентификаторов пользователя.

Общая цель этого запроса - получить все строки, в которых требуется значение столбца (user_id's in this case)> 1 ...

Пример:

we have 3 rows > A, B, C
row A has user_id = 1;
row B has user_id = 1;
row C has user_id = 2;

result should have [user_id: 1] as the count becomes greater than 1

Приведенный выше необработанный запрос работает для мне, но теперь, когда я пишу API, мне было интересно, как это может быть воспроизведено в Eloquent.

ПОЖАЛУЙСТА, ПОМОГИТЕ!

1 Ответ

0 голосов
/ 03 февраля 2020

Таким образом, красноречивый способ для этого запроса может быть выполнен с использованием методов groupBy и havingRaw

. Сначала мы выбираем столбцы, которые нам нужно объединить

OrderPayment::select('user_id', \DB::raw('COUNT(user_id) as payment_made))* 1008. *

затем мы сгруппируем нужный нам атрибут - groupBy('user_id'), обратите внимание, что свойство, по которому мы группируем, должно быть в операторе select, или это не сработает.

Теперь последнее предложение, где мы видим, есть ли несколько строк имеют одинаковые user_id, мы используем> havingRaw('COUNT(user_id) > ?', [1])

Теперь общий красноречивый запрос выглядит следующим образом

OrderPayment::select('user_id', \DB::raw('COUNT(user_id) as payment_made))
    ->groupBy('user_id')
    ->havingRaw('COUNT(user_id) > ?', [1])
    ->get();

Обратите внимание, что в предложении select мы передаем DB Необработанный оператор, который передается в виде строки в построитель запросов, и поэтому следует соблюдать осторожность с SQL инъекциями.

...