簡體   English   中英

Laravel檢索雄辯的嵌套渴望加載

[英]Laravel retrieving eloquent nested eager loading

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

觸發器通過數據透視表運行,但應該使用相同的方法可以訪問?

我創建了一個HasManyThrough具有無限層次和支持的關系BelongsToMany
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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM