簡體   English   中英

Eloquent:獲取列值(x)存在於多於一行的所有行(SQL DB)

[英]Eloquent: Get all rows where column value(x) exists in more than one row (SQL DB)

我想在 Laravel 的 Eloquent 中執行以下原始 SQL 查詢:

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一起使用where in以便選擇同一表( order_payment )中具有payment_status=paid並按count > 1的屬性user_id分組的所有行,然后最后我們從給定的用戶 ID 集中選擇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 中復制它。

請幫忙!

所以這個查詢的雄辯方式可以使用groupByhavingRaw方法來完成

我們首先選擇我們需要聚合的列

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

然后我們 groupBy 我們需要的 arribute - groupBy('user_id') ,請注意,我們分組的屬性必須在 select 語句中,否則這將不起作用。

現在是我們查看是否有多行具有相同user_id的最后一個子句,我們使用 > havingRaw('COUNT(user_id) > ?', [1])

現在整個 eloquent 查詢看起來像這樣

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

請注意,在 select 子句中,我們將 DB 原始語句作為字符串傳遞給查詢構建器,因此應該小心 SQL 注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM