Laravel 哪里和哪里?
Laravel whereIn AND whereIn?
所以我试图根据两个字段显示重复的结果,它们必须匹配。我有一个 Expense
模型,我只想获取 date
和 amount
相同的结果,以及 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
所以我试图根据两个字段显示重复的结果,它们必须匹配。我有一个 Expense
模型,我只想获取 date
和 amount
相同的结果,以及 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