Laravel中与破坏记录的深层关系5.1 Eloquent模型

时间:2015-06-30 18:54:24

标签: php laravel eloquent laravel-5

关系定义如下:

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?是否也可以包含被阻止的那些"被破坏的记录?

1 个答案:

答案 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();
     }
]);