如何在Laravel Eloquent中联接3个以上的表

时间:2019-10-09 12:52:42

标签: laravel eloquent

我可以像这样在Laravel laravel中加入3个表:

     B                 D                 E
+-----------+     +-----------+     +-----------+
| *id       |     | *id       |     | *id       |
|           |     |  B_id     |     |           |
|           |    /|  E_id     |\    |           |
|           |-----|           |-----|           |
|           |    \|           |/    |           |
|           |     |           |     |           |
+-----------+     +-----------+     +-----------+

$queries = DB::table('D')
    ->join('B', 'B.id', '=', 'D.B_id')
    ->join('E', 'E.id', '=', 'D.E_id')
    ->select('*')
    ->get();

那么我如何联接三个以上的表,如下所示:

     A                  B                 D                 E
+-----------+      +-----------+     +-----------+     +-----------+
| *id       |      | *id       |     | *id       |     | *id       |
| B_id      |      |           |     |  B_id     |     |           |
|           |\     |           |    /|  E_id     |\    |           |
|           +------|           |-----|           |-----|           |
|           |/     |           |    \|           |/    |           |
|           |      |           |     |           |     |           |
+-----------+      +-----------+     +-----------+     +-----------+

我在SQL中尝试做的事情如下:

SELECT * FROM A,B,C,D
WHERE B.id=A.B_id
AND B.id=D.B_id
AND D.E_id=E.id

1 个答案:

答案 0 :(得分:0)

使用交叉联接然后在查询的where部分中使用联接条件是一种不好的做法。

您需要将第二个查询转换为使用INNER JOIN(或仅使用JOIN来相同)。

然后,转换为雄辩的将更为直接。您可以写:

SELECT * 
FROM B 
    JOIN A ON B.id=A.B_id
    JOIN D ON B.id=D.B_id
    JOIN E ON E.id=D.E_id

那么您的雄辩查询将很简单:

$queries = DB::table('B')
    ->join('A', 'B.id', '=', 'A.B_id')
    ->join('D', 'B.id', '=', 'D.B_id')
    ->join('E', 'E.id', '=', 'D.E_id')
    ->select('*')
    ->get();