【问题标题】:Select for many to many relation选择多对多关系
【发布时间】:2017-09-26 21:26:53
【问题描述】:

我想了解根据我的方案进行选择的外观。由于它是多对多关系,因此我在方案中使用了绑定表。

现在,我的应用情况是:我想用一些 id 显示车辆的所有维修情况。在我的函数中,我将id 存储在一个变量中,比如说$id,所以我知道我想要查看所有维修的车辆,所以在这种情况下,表vehicles 对于我需要的这个选择并不重要。

所以我想为repairs.vehicle_id = $id 的特定车辆编写一个选择。

一个修复行必须包含列 worker namesurname。稍后,我有一张准备添加到维修中的零件表,但它与工人的情况相同,所以我现在只想了解,我如何使用joinsgroup by 和其他必要的来编写这样的select sql函数让工作人员进行修复。

当然,在一次维修中,可以有更多的工人。 表repair_worker 如下所示:

"repair_id" , "worker_id"
    "86"    ,     "2"
    "87"    ,     "3"
    "87"    ,     "4"
    "88"    ,     "1"
    "88"    ,     "2"

我正在使用 Laravel 框架,但我只想使用 RAW SQL,如果可能的话不要使用 laravel 函数。

编辑:

$repairs = DB::select(DB::raw('
            select r.id repair_id, w.name, w.surname
                from repairs r
                    join repair_worker rw on r.id = rw.repair_id
                    join workers w on w.id = rw.worker_id
                where r.vehicle_id = ?
                group by w.name, w.surname, r.id
'),[$vehicle->id]);

【问题讨论】:

    标签: php sql postgresql laravel many-to-many


    【解决方案1】:

    如果您只想要工人的姓名,这应该可以:

    select r.id repair_id, w.Name, w.SurName
    from repairs r
    join repair_worker rw on r.id = rw.repair_id
    join workers w on w.id = rw.worker_id
    where r.vehicle_id = $id
    group by r.id, w.Name, w.SurName
    

    要将修复放在一行中,将所有工作人员放在一列中,您可以这样做:

    select r.id repair_id, string_agg(w.Name || ' ' || w.SurName, ', ') workers
    from repairs r
    join repair_worker rw on r.id = rw.repair_id
    join workers w on w.id = rw.worker_id
    where r.vehicle_id = ?
    group by r.id;
    

    【讨论】:

    • 我可以在 sql raw 中使用$id 吗?
    • 我对 Laravel 不熟悉,但我认为你会像这样传递参数:$workers = DB::select('...where r.vehicle_id = ?', [1]); 我假设你已经处理好了这部分。
    • 我要试试。如果我还想选择修复 ID,您的选择将如何改变?或者甚至更好(不确定是否可能),选择修复 ID 并将该修复 ID 的所有工作人员放在一个“数组”中以将它们打印为一列?
    • 我已将repair_id 添加到查询中。你的意思是你希望所有的维修工人都显示在一个逗号分隔的字段中?
    • 谢谢。是的,完全一样。
    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多