【发布时间】:2018-04-27 00:28:43
【问题描述】:
我在 laravel 框架中使用 eloquent。我想通过表 B 和表 C 从表 D 中获取与表 A 相关的模型。
有没有办法做到这一点?
这是数据库的示例数据:
INSERT INTO A (idA) VALUES(1);
INSERT INTO A (idA) VALUES(2);
INSERT INTO A (idA) VALUES(3);
INSERT INTO B (idB, A_idA) VALUES(1, 1);
INSERT INTO B (idB, A_idA) VALUES(2, 2);
INSERT INTO C (idC, A_idA) VALUES(1, 1);
INSERT INTO C (idC, A_idA) VALUES(2, 2);
INSERT INTO C (idC, A_idA) VALUES(3, 3);
INSERT INTO D (idD, B_idB, C_idC) VALUES(1, 1, 1);
INSERT INTO D (idD, B_idB, C_idC) VALUES(2, 2, 2);
INSERT INTO D (idD, B_idB, C_idC) VALUES(3, 2, 3);
以下是模型:
class A extends Model
{
protected $table = "A";
protected $primaryKey = "idA";
public $timestamps = false;
public function B()
{
return $this->hasMany("App\B", "A_idA");
}
public function C()
{
return $this->hasMany("App\C", "A_idA");
}
}
class B extends Model
{
protected $table = "B";
protected $primaryKey = "idB";
public $timestamps = false;
public function D()
{
return $this->hasMany("App\D", "B_idB");
}
public function A()
{
return $this->belongsTo("App\A", "A_idA");
}
}
class C extends Model
{
protected $table = "C";
protected $primaryKey = "idC";
public $timestamps = false;
public function D()
{
return $this->hasMany("App\D", "C_idC");
}
public function A()
{
return $this->belongsTo("App\A", "A_idA");
}
}
class D extends Model
{
protected $table = "D";
protected $primaryKey = "idD";
public $timestamps = false;
public function B()
{
return $this->belongsTo("App\B", "B_idB");
}
public function C()
{
return $this->belongsTo("App\C", "C_idC");
}
}
这里是控制器
class TestController extends Controller
{
public function test()
{
$aWithRelatedDs = A::with(['B.D'])->whereHas("B.D")->whereHas("C.D")->get();
dd($aWithRelatedDs);
}
}
这是输出:
Collection {#380 ▼
#items: array:2 [▼
0 => A {#390 ▶}
1 => A {#388 ▼
#table: "A"
... snip ...
#relations: array:1 [▼
"B" => Collection {#387 ▼
#items: array:1 [▼
0 => B {#398 ▼
#table: "B"
... snip ...
#relations: array:1 [▼
"D" => Collection {#395 ▼
#items: array:2 [▼
0 => D {#407 ▼
#table: "D"
... snip ...
#attributes: array:3 [▼
"idD" => 2
"B_idB" => 2
"C_idC" => 2
]
... snip ...
}
1 => D {#408 ▼
#table: "D"
... snip ...
#attributes: array:3 [▼
"idD" => 3
"B_idB" => 2
"C_idC" => 3
]
... snip ...
}]}]
... snip ...
问题:A #2 没有通过 B 和 C 关联的两个 D,它只有通过两个中间表关联的 D #2,但在上面的结果中它仍然被列出。我该如何限制这一点,所以两个关联必须是同一个模型?
【问题讨论】:
-
请发布您已经尝试过的代码。
-
两个 whereHas 是正确的方法。你做错了
-
@Namoshek 我添加了代码。谢谢。
-
@devk 一定是我看不到的东西。
-
哦,它们必须关联到同一个模型 D。这会改变它。我不确定 2 whereHas 是要走的路。像
A::whereHas('b.d.c')->get()这样的东西怎么样。注意到我不确定点符号是否适用于whereHas,只是假设它在您的示例中有效