php – 雄辩的嵌套关系与一些约束

我有以下三个表:

A
-------------
| id | name |
-------------

B
--------------------
| id | A_id | name |
--------------------

C
--------------------
| id | B_id | name |
--------------------

因此,表C中的数据属于表B中的属于表A中的数据的数据.现在,我想查询C,同时也从B和A检索数据,以下代码也是很好的.

C::with('B.A')->get();

现在的问题是,我想用一些约束来查询C.其中一个约束是A的ID.我尝试过以下操作:

C::with(array('B.A' => function ($query)
{
    $query->where('id', '=', $constraint);
}))->get();

但似乎Eloquent会检索C中的所有行,除非执行查询以检索表A中的数据,否则不考虑约束.我如何解决这个问题?我需要在C中添加另一个字段,即A_id,并且将匹配$constraint与该字段匹配?

最佳答案
您将conf()方法与SQL的JOIN混淆,并发生很多事情.

首先有一点背景

当您使用Foo :: with(‘bar’) – > where_something(1)时,Laravel将首先加载Foo,然后根据Foo.bar_id,它将加载栏.它的目的是告诉Laravel对模型的加载依赖关系进行组合查询,大大提高了这些模型的迭代性能.

如果不使用它,应执行以下查询:

SELECT * FROM foos WHERE foos.something = 1;
SELECT * FROM bars WHERE bars.id = 30;
SELECT * FROM bars WHERE bars.id = 57;
SELECT * FROM bars WHERE bars.id = 134;
SELECT * FROM bars WHERE bars.id = 1096;

另一方面,如果你使用它,

SELECT * FROM foos WHERE foos.something = 1;
SELECT * FROM bars WHERE bars.id IN (30, 57, 134, 1096); // Eager loading

当使用()添加条件时,您只是限制这些依赖关系的热切加载,而不是第一个查询.

现在回答你的问题

要实现你想要的,你需要使用 – > join().

C::with(array('b', 'b.a'))
 ->join('b', 'b.id', '=', 'c.b_id')
 ->join('a', 'a.id', '=', 'b.a_id')
 ->where('a.id', '=', $ID)
 ->get('c.*');

我已经包含了with(),因为我不知道你是否需要访问$c-> b-> a.如果你没有,而且你只需要$c数据,你可以删除with(),因为它会不必要地查询B和A.

转载注明原文:php – 雄辩的嵌套关系与一些约束 - 代码日志