我试图使用" belongsToMany"来定义多对多关系。 2个表与查找表之间的关系。这些是我的表格:
在EncounterTemplate模型中,我尝试附加属于它的表单列表,因此我有一个带有以下内容的forms()函数:
public function forms() {
return $this->belongsToMany('\App\EncounterForm', 'encounter_templates_forms', 'template_id', 'form_id');
}
然而,它返回一个空对象。我可以通过使用以下代码来实现它:
$forms = \App\EncounterTemplateForm::where("template_id",$this->id)
->join("encounter_forms", "encounter_templates_forms.form_id","=","encounter_forms.id")
->get();
return $forms;
但是我想知道我的关系声明我做错了什么。我更喜欢这样做"正确的" Laravel的方式,如果我能。非常感谢任何见解。
编辑:如果我运行EncounterTemplate :: find(1) - > forms() - > toSql()我得到以下查询:
select * from `encounter_forms` inner join `encounter_templates_forms` on `encounter_forms`.`id` = `encounter_templates_forms`.`form_id` where `encounter_templates_forms`.`template_id` = 1
返回预期结果......所以问题可能是下游问题......
答案 0 :(得分:1)
因此,我进一步向下游动态调用forms()方法。事实证明我需要在它上面调用 - > get(),因为它显然是form()返回一个查询构建器实例而不是模型结果。对于任何感兴趣的未来人,这就是我的工作代码:
$record = $model::find($id);
$include = $request->input("include");
$result_array = $record->toArray();
if ($include) {
$includes = json_decode($include);
foreach ($includes as $child_model) {
$child = $record->$child_model();
$result_array[$child_model] = $child->get(); //where $child == 'forms'
}
}
return $record_array;
感谢帮助解决詹姆斯问题!您的意见帮助我缩小了问题的根源。
答案 1 :(得分:0)
从文档中看起来你的关系有点偏差:
...第三个参数是您定义关系的模型的外键名称,而第四个参数是您要加入的模型的外键名称
因此参数如下:
鉴于您目前正在EncounterTemplate
模型上定义此关系,第三个参数应为template_id
,第四个参数应为form_id
:
public function forms() {
return $this->belongsToMany('App\EncounterForm', 'encounter_templates_forms', 'template_id', 'form_id');
}
答案 2 :(得分:0)
尝试这个对我有用的。
在模型中添加
EncounterTemplate模型
public function encounterTemplateForm()
{
return $this->hasMany(EncounterTemplateForm::class);
}
EncounterForm模型
public function encounterTemplateForm()
{
return $this->hasMany(EncounterTemplateForm::class);
}
EncounterTemplateForm模型
public function template()
{
return $this->belongsTo(EncounterTemplate::class, 'template_id', 'id');
}
public function form()
{
return $this->belongsTo(EncounterForm::class, 'form_id', 'id');
}