Laravel Eloquent抓取重复项(2个或更多结果)

sgtfey8w  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(159)

所以我有下面的查询,它是有效的:

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

这是为了获取所有可能重复的expenses(相同的金额和相同的日期)。但是,我想获取所有内容,而不仅仅是amountdate。以下内容不起作用:

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

这将给予我这个错误:

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of the SELECT list is not in the GROUP BY clause and contains a nonaggregated column

我想在视图中列出Expense的更多字段,最重要的当然是名称,还有slug,这样我就可以链接到每个潜在的重复项,等等。
还有,第二个“问题”,但不是最重要的,是使用上面的查询,所有的费用都在一个集合中返回。例如,它们不是按日期分组的。
最理想的结果是这样的,所有可能重复的数据都应该按日期分组,这样我就可以在我的视图中执行类似的操作:

@foreach($duplicates as $date => $expenses)

    @foreach($expenses as $expense)

    {{ $date }}

    // List all expenses for that date.. etc.

问题1:如何使上述查询适用于所有数据库字段,而不仅仅是dateamount
问题2:我如何能够获取潜在的重复项并按日期对它们进行分组,以便像上面的示例那样循环日期和费用?

tv6aics1

tv6aics11#

进行分组时始终正确处理列
即,可以指定要在groupBy中选择的所有字段

// database query
$expenses = Expense::select(['amount', 'date', 'name', 'slug'])
                    ->selectRaw('count(*) AS count')
                    ->havingRaw('count > 1')
                    ->groupBy(['amount', 'date', 'name', 'slug'])
                    ->get();

// Another date grouping done in collection
return $expenses->groupBy('date');

或者类似于组合属于所需分组的列

return Expense::select('date')
    ->selectRaw('group_concat(name) as names') // comma separated names belongs to the group 
    ->selectRaw('group_concat(amount) as amounts') // comma separated amounts belongs to the group 
    ->selectRaw('group_concat(slug) as slugs')// comma separated slugs belongs to the group 
    ->selectRaw('count(*) AS count')
    ->havingRaw('count > 1')
    ->groupBy('date')
    ->get();
    • 编辑**

如果您只想按日期对它们进行分组,但仍有实际的重复行,则只需添加另一个select语句来计算日期重复,而不在查询中按日期对它们进行分组,然后在集合中进行日期分组。

$expenses  = Expense::select( ['amount', 'date', 'name', 'slug'] )
    ->selectRaw('(SELECT COUNT(date) FROM expenses t1 WHERE t1.date = expenses.date ) as duplicates')
    ->havingRaw('duplicates > 1')
    ->get();

return $expenses->groupBy('date');

然后,输出应包含另一列duplicates,其中包含每个日期的重复次数,并且仍包含重复日期的所有行

相关问题