Eloquent:获取列value(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 这样同一 table(order_payment) 中的所有行都具有 payment_status=paid并按 属性 user_id 分组 count > 1 进行 select 编辑,最后我们从给定的一组用户 ID 中 select distinct user_ids

此查询的总体 objective 是获取所需列值 (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 方法

完成此查询的 eloquent 方式

我们首先 select 我们需要聚合的列

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

然后我们对我们需要的数组进行分组 - 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 注入。