【问题标题】:How to use DISTINCT ON in Laravel Eloquent如何在 Laravel Eloquent 中使用 DISTINCT ON
【发布时间】:2021-09-29 23:16:30
【问题描述】:

这是我的完整 SQL 语句:

SELECT DISTINCT ON (hbg.group_id)
    hbg.group_id,
    hbg.id AS id,
    hbg.group_name,
    hbg.group_description,
    hbg.group_type_id,
    hbgt.group_type_name,
    hbg.category_id,
    hbg.effective_start_datetime,
    hbg.created_by,
    hbg.created_datetime,
    hbg.archived_by,
    hbg.archived_datetime
FROM hms_bbr_group hbg
LEFT JOIN hms_bbr_group_type hbgt
    ON hbg.group_type_id = hbgt.group_type_id
ORDER BY
    hbg.group_id,
    hbg.id DESC;  

我正在尝试将此语句转换为 Laravel Eloquent 代码:

public function fetchgroup(){
    $all_groups = HmsBbrGroup::leftJoin('hms_bbr_group_type', 'hms_bbr_group.group_type_id', '=', 'hms_bbr_group_type.group_type_id')
                               ->distinct('group_id')
                               ->orderBy('group_id', 'ASC', 'id', 'DESC')->get();
    return response()->json([
        'all_groups'=>$all_groups,
    ]);
}
  • 我读过 eloquent 不知何故不支持 DISTINCT ON 所以我不能简单地做distinctOn('group_id')
  • 如果是这种情况,有什么办法可以修改函数内部的select以使用DISTINCT ON?

【问题讨论】:

  • distinct on 是 Postgres 扩展。
  • 这就是为什么我要问如何在 eloquent 中使用它,否则我的选择将无法按预期工作
  • 这是不同的,因为我发现 Laravel Eloquent 在 DISTINCT ON 下做了一些不同的事情,我只是在改变我的问题的性质以更好地满足需要

标签: sql laravel select eloquent distinct-on


【解决方案1】:

在您的选择语句中使用DB::raw 或在末尾添加selectRaw。以下是一些选项:

->select(
    DB::raw('distinct on (hbg.group_id)'),
    'hbg.group_id',
    ...)

->select(...)
->selectRaw('distinct on (hbg.group_id)')

->selectRaw('DISTINCT ON (hbg.group_id)
    hbg.group_id,
    hbg.id AS id,
    hbg.group_name,
    hbg.group_description,
    hbg.group_type_id,
    hbgt.group_type_name,
    hbg.category_id,
    hbg.effective_start_datetime,
    hbg.created_by,
    hbg.created_datetime,
    hbg.archived_by,
    hbg.archived_datetime
')

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 2020-06-24
    相关资源
    最近更新 更多