2017-10-20 128 views
0

我試圖用查找表使用2個表之間的「belongsToMany」關係來定義多對多關係。這些都是我的表:Laravel belongsToMany不工作

encounter_templates(EncounterTemplate模型)

  • ID
  • TEMPLATE_NAME
  • ...(更多不相干的colums)

encounter_forms(EncounterForm模型)

  • id
  • FORM_NAME
  • ...(更多不相干的colums)

encounter_templates_forms(EncounterTemplateForm模型)

  • ID
  • template_id
  • form_id

在EncounterTemplate模型我試圖附加的屬於它形成了一個列表,所以我有以下內容的形式()函數:

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 ::發現(1) - >形式() - > 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

所以進一步下游我動態調用forms()方法。事實證明,我需要調用一個 - > get(),因爲它顯然是forms()返回查詢生成器實例而不是模型結果。對於任何未來的人感興趣,這是我的工作代碼看起來像:

$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; 

感謝您的疑難解答詹姆斯的幫助!您的意見幫助我縮小了問題的根源。

0

看起來你們的關係僅僅是一個小關,從文檔:

...第三個參數是要定義關係的模型的外鍵名稱,而第四個參數是要加入的模型的外鍵名稱

因爲這樣的參數是這樣的:

  1. 要鏈接到
  2. 是連接這些記錄
  3. 在連接表中的字段的引用當前型號名稱表的名稱另一種模式
  4. 的連接表中的字段引用國外模型

給你要定義在EncounterTemplate模型這種關係目前,第三個參數應該是template_id和第四form_id名稱:

public function forms() { 
    return $this->belongsToMany('App\EncounterForm', 'encounter_templates_forms', 'template_id', 'form_id'); 
} 
+0

你是對的文檔表明它應該是另一種方式,這是我最初如何嘗試它,但不幸的是我嘗試了兩種變化,似乎都沒有工作。我已經編輯了我的帖子來反轉列名稱(並且再次運行我的代碼,並將其顛倒過來以便三重檢查我是否會發瘋),但它仍然無效。 – user3246127

+0

@ user3246127嘗試預覽SQL,看看發生了什麼'EncounterTemplate :: find(1) - > forms-> toSql();'這裏假定你有一個具有表單的模板1。 – James

+0

它返回正確的查詢和運行該查詢原始返回預期的結果,所以也許問題是在我的項目進一步下游的地方。當我弄明白時,我會更新這個問題! – user3246127

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'); 
}