我正在尝试使用 join 方法从 2 个不同的表中获取数据。我已经创建了一个 Eloquent 程序来实现与
orderBy()
方法完美配合的效果。
现在我只想根据具有相同 Eloquent 方法的列对数据进行分组,但不会返回最新/最后插入的数据。
我的询问如下供您参考,
$def_reminders = Invoice::from('invoices AS inv')
->join('reminders_calendar AS remcal', 'remcal.invoice_id', '=', 'inv.id')
->where([
'inv.user_id' => 1,
'inv.is_deleted' => '0',
])
->where('inv.reminder_status', '!=', 'Enabled')
->whereDate('remcal.date_when', '2024-01-03')
->whereIn('remcal.reminder_type', ['InProgress', 'Waiting'])
// ->whereRaw('remcal.id = (select max(`id`) from reminders_calendar)')
->selectRaw('MAX(remcal.id) as remcal_id, remcal.invoice_id AS remcal_invoice_id, remcal.*, inv.*')
->groupBy('remcal.invoice_id')
->orderBy('remcal.id', 'desc')
->get();
每当我发表评论时,
groupBy('remcal.invoice_id')
方法都会正确返回所有数据,并按照最新/最后数据到先前数据的顺序。
在连接查询中使用
groupBy()
和 orderBy()
方法时,我对从 2 个表获取数据感到有点困惑。
终于找到了让它发挥作用的解决方案。当我使用groupBy时,它将指定列中具有相同值的行分组为聚合数据。就我而言,它按
remcal.invoice_id
分组。而且,当我使用 orderBy('remcal.id', 'desc')
时,它会尝试按 remcal 的 id 降序排序。但由于 groupBy,它可能不是在组中选择的最新的 id
,因此我无法获取最新插入的数据。
我的工作代码如下,
$sub = DB::table('reminders_calendar')
->select('invoice_id', DB::raw('MAX(id) as max_id'))
->groupBy('invoice_id');
$def_reminders = DB::table('invoices AS inv')
->joinSub($sub, 'max_remcal', function ($join) {
$join->on('inv.id', '=', 'max_remcal.invoice_id');
})
->join('reminders_calendar AS remcal', function ($join) {
$join->on('inv.id', '=', 'remcal.invoice_id')
->on('remcal.id', '=', 'max_remcal.max_id');
})
->where([
'inv.user_id' => 1,
'inv.is_deleted' => '0',
])
->where('inv.reminder_status', '!=', 'Enabled')
->whereDate('remcal.date_when', '2024-01-03')
->whereIn('remcal.reminder_type', ['InProgress', 'Waiting'])
->select('remcal.*', 'inv.*')
->orderBy('remcal.id', 'desc')
->get();