Laravel属于ToMany不工作

时间:2017-10-20 00:26:04

标签: php laravel eloquent

我试图使用" belongsToMany"来定义多对多关系。 2个表与查找表之间的关系。这些是我的表格:

encounter_templates(EncounterTemplate model)

  • ID
  • TEMPLATE_NAME
  • ...(更无关的字符串)

encounter_forms(EncounterForm模型)

  • ID
  • FORM_NAME
  • ...(更无关的字符串)

encounter_templates_forms(EncounterTemplateForm model)

  • ID
  • template_id
  • form_id

在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

返回预期结果......所以问题可能是下游问题......

3 个答案:

答案 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)

从文档中看起来你的关系有点偏差:

  

...第三个参数是您定义关系的模型的外键名称,而第四个参数是您要加入的模型的外键名称

因此参数如下:

  1. 您要链接到的其他模型
  2. 加入这些记录的表的名称
  3. 引用当前模型
  4. 的连接表中字段的名称
  5. 引用外部模型
  6. 的连接表中字段的名称

    鉴于您目前正在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');
}