Laravel检索雄辩的嵌套渴望加载

时间:2016-11-16 10:58:51

标签: php laravel eloquent

在我的应用程序中,我有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');
    }
}

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

1 个答案:

答案 0 :(得分:0)

我创建了一个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;