选择多对多的关系

时间:2017-04-28 17:19:15

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

我想了解根据我的方案选择应该如何。由于它有很多关系,我在方案中使用了绑定表。 many to many scheme

现在,我的应用情况是:我想显示一些id的车辆的所有维修。在我的函数中,我将id存储在变量中,让我们说$id所以我知道我希望看到所有修复的车辆,因此表vehicles并不重要我需要这个选择的情况。

所以我想在repairs.vehicle_id = $id

的特定车辆上写一个选择

一个修复行必须包含worker namesurname列。稍后,我有一个准备添加到维修中的零件表,但它与工作人员的情况相同,所以我现在只想了解,如何使用select和{{joins来编写group by 1}}和其他必要的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]);

1 个答案:

答案 0 :(得分:0)

如果你只想要工人的名字,这应该有效:

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;