Laravel 哪里和哪里?

Laravel whereIn AND whereIn?

所以我试图根据两个字段显示重复的结果,它们必须匹配。我有一个 Expense 模型,我只想获取 dateamount 相同的结果,以及 return 这些结果。例如,我到目前为止所拥有的:

$results = Expense::where(function ($query) {
        $query->whereIn('amount', function ($q) {
            $q->select('amount')->from('expenses')->groupBy('amount')->havingRaw('count(*) > 1');
        })->whereIn('date', function ($q) {
            $q->select('date')->from('expenses')->groupBy('date')->havingRaw('count(*) > 1');
        });
    })
    ->get();

这确实向我显示了重复的结果,但也只有金额或日期匹配,但我需要金额和日期都匹配。下面给出了相同的结果:

Expense::whereIn('date', array_column(DB::select('select date from expenses group by date having count(*) > 1'), 'date'))
    ->whereIn('amount', array_column(DB::select('select amount from expenses group by amount having count(*) > 1'), 'amount'))
    ->get());

因此,例如,在我的数据库中,我有以下 expenses:

Name: Expense 1
Amount: 500
Date: 2022-04-16

Name: Expense 2
Amount: 500
Date: 2022-04-16

Name: Expense 3
Amount: 500
Date: 2022-04-15

第三笔费用不应该 returned 但它确实包含在结果中。有什么指示可以让我朝着正确的方向前进吗?

尽管它没有使用 whereIn,正如您在问题中所述,您也可以按两列对行进行分组。
因此,您可以告诉 Eloquent 到 select 您感兴趣的两列以及 count 聚合,然后按这两列分组并仅要求具有 count 大于 1.

$results = Expense:select('amount','date', DB::raw('COUNT(*) as `count`'))
    ->groupBy('amount', 'date')
    ->havingRaw('COUNT(*) > 1')
    ->get();

下面的例子:

费用 1

  • 金额:500
  • 日期:2022-04-16

费用 2

  • 金额:500
  • 日期:2022-04-16

费用 3

  • 金额:500
  • 日期:2022-04-15

预期结果为:

  • 金额:500
  • 日期:2022-04-16
  • 计数:2