在我的应用程序中,我有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');
}
}
触发器通过数据透视表运行,但应该可以使用相同的方法访问?
答案 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;