【问题标题】:Deep Relationships with Trashed Records in Laravel 5.1 Eloquent modelLaravel 5.1 Eloquent 模型中与垃圾记录的深度关系
【发布时间】:2015-06-30 18:54:23
【问题描述】:

关系定义如下:

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 记录可能会被软删除(丢弃),这会带来额外的复杂性。我是否有可能更优雅地获得所有与Apple 相关的Pineapples?是否也可以包括那些被垃圾记录“阻止”的内容?

【问题讨论】:

    标签: php laravel eloquent laravel-5


    【解决方案1】:

    我通过使用范围和延迟加载解决了这个问题。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-04
      • 2016-04-12
      • 2020-10-26
      • 2020-03-12
      • 2016-06-22
      • 2016-02-26
      • 1970-01-01
      • 2017-02-16
      相关资源
      最近更新 更多