[英]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.