关系定义如下:
Apples hasMany Grapes hasMany Bananas hasOne Pineapple
我希望能够做到以下几点:
$apple = \App\Apple::find(1);
$pineapples = $apple->pineapples
我通过在Apple.php
public function pineapples(){
$apple = $this;
return Pineapple::whereHas('banana', function($banana) use ($apple)
{
$banana->whereHas('grape', function($grape) use ($apple)
{
$grape->where('apple_id', '=', $apple->id);
});
})->get();
}
然而,更复杂的是,某些Banana
记录可以被软删除(删除)。我是否可以更优雅地获得与Pineapples
远远相关的所有Apple
?是否也可以包含被阻止的那些"被破坏的记录?
答案 0 :(得分:0)
我通过使用范围和懒惰的急切加载来解决这个问题。
Pineapple.php
public function scopefromApple($query, $appleId = 1)
{
$query->join('bananas', 'bananas.id', '=', 'pineapples.banana_id')
->join('grapes', 'grapes.id', '=', 'bananas.grape_id')
->join('apples', 'apples.id', '=', 'grapes.apple_id')
->where('apples.id', '=', $appleId);
}
这使我可以成功使用\App\Pineapple::fromApple()
。如果我需要包含已删除的Banana
记录:
$pineapples = \App\Pineapple::fromApple();
$pineapples->load([
'banana' => function ($query){
$query->withTrashed();
}
]);