2016-07-18 77 views
0

我有那些模式:Laravel關係屬於關聯ID無法識別

Schema::create('tickets', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->integer('ticket_reason_id')->unsigned(); 
    $table->integer('user_id')->unsigned(); 
    $table->timestamps(); 
    $table->foreign('ticket_reason_id')->references('id')->on('ticket_reasons')->onDelete('cascade'); 
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
}); 

Schema::create('ticket_reasons', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name'); 
    $table->timestamps(); 
}); 

而這些定義的關係

class Ticket extends Model 
{ 

    public function user() 
    { 
     return $this->belongsTo(User::class); 
    } 

    public function reason() 
    { 
     return $this->belongsTo(TicketReason::class, 'ticket_reason_id'); 
    } 

} 

「理性」的方法的作品,但我不得不手動添加ID。爲什麼我要按照慣例添加ID? (或者至少我是這麼認爲的)。它遵循與user_id列相同的約定,它不需要id設置器。

+0

它可能與表名中的下劃線有關? – Sam

+0

這是我的想法,但我無法在文檔中找到任何內容@Sam – Alan

+0

我剛剛通過文檔快速閱讀......你可以嘗試將'Ticket'函數重命名爲'ticket_reason()'並查看它是否可以正常工作,而無需指定外鍵?如果是這樣,我可以添加這個作爲答案和鏈接到文檔。 – Sam

回答

1

所以,我要對Laravel的Eloquent文檔在這一篇上寫錯了......因爲關於如何自動生成外鍵真的不太清楚。我發現這一點,從Eloquent Relationships page,雖然(重點煤礦):

雄辯會嘗試將user_idPhone模型匹配到idUser模型。 Eloquent通過確定默認外鍵名稱,檢查關係方法的名稱,並將方法名稱後綴爲_id

與某人(你,我自己等)可能承擔的情況相反,外鍵不是由外部類的名稱生成的。相反,它使用的是您的::belongsTo()(或hasOne()等)調用的方法的名稱。


這意味着public function reason() {}需要改爲public function ticket_reason() {}。或者,當然,您可以將您的專欄名稱更改爲reason_id

+0

真棒,謝謝! – Alan