【问题标题】:Laravel retrieving eloquent nested eager loadingLaravel 检索雄辩的嵌套急切加载
【发布时间】:2018-07-28 08:53:03
【问题描述】:

在我的应用程序中,我有 4 个相互关联的模型。

Forms->categories->fields->triggers

我想要做的是获取引用当前表单的触发器。

经过研究,我发现嵌套的渴望加载,这需要我的代码看起来像这样

Form::with('categories.fields.triggers')->get();

通过对此的响应,我可以清楚地看到关系一直到我想要的触发器。

现在我正在努力的部分只是获取触发器,而不是循环遍历每个模型。

我知道的代码有效:

$form = Form::findOrFail($id);

$categories = $form->categories;
foreach ($categories as $category) {
    $fields = $category->fields;
    foreach ($fields as $field) {
        $triggers[] = $field->triggers;
    }
}

我知道这可行,但可以简化吗?是否可以写:

$form = Form::with('categories.fields.triggers')->get()

$triggers = $form->categories->fields->triggers;

要获取相关的触发器?从现在开始这样做会导致:

Undefined property: Illuminate\Database\Eloquent\Collection::$categories

因为它试图在集合上运行$form->categories

我该怎么做呢?我需要在我的模型上使用HasManyThrough 关系吗?

我的模型

class Form extends Model
{   
    public function categories()
    {
        return $this->hasMany('App\Category');
    }
}


class Category extends Model
{
    public function form()
    {
        return $this->belongsTo('App\Form');
    }

    public function fields()
    {
        return $this->hasMany('App\Field');
    }
}

class Field extends Model
{
    public function category()
    {
        return $this->belongsTo('App\Category');
    }

    public function triggers()
    {
        return $this->belongsToMany('App\Trigger');
    }
}

class Trigger extends Model
{
    public function fields()
    {
        return $this->belongsToMany('App\Field');
    }
}

触发器通过数据透视表运行,但应该可以使用相同的方法访问?

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    我创建了一个无限级别的HasManyThrough 关系并支持BelongsToMany:
    Repository on GitHub

    安装后,可以这样使用:

    class Form extends Model {
        use \Staudenmeir\EloquentHasManyDeep\HasRelationships;
    
        public function triggers() {
            return $this->hasManyDeep(Trigger::class, [Category::class, Field::class, 'field_trigger']);
        }
    }
    
    Form::with('triggers')->get();
    Form::findOrFail($id)->triggers;
    

    【讨论】:

      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 2013-09-22
      • 2019-09-14
      • 1970-01-01
      • 2018-12-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      相关资源
      最近更新 更多