2017-07-09 91 views
1

更新至5.4後,我的關係不再正常工作。經過檢查,我發現Laravel現在正在尋找不同的 foreignKey名稱:user_user_idpost_post_id而不是user_id,post_id等。這是工作,直到L 5.3。我也不得不更新一些數據透視tabels primarykey到tag_tag_id等,以便讓他們再次工作。Laravel 5.3至5.4關係foreignKey issue

我更新了我的表foreignkey名稱根據這個新的約定,現在它的工作。但我仍然想知道爲什麼以及如何改變以及它來自哪裏。

謝謝!

回答

1

您是否正在使用getKeyName覆蓋模型上的主鍵?

Laravel仍然使用相同的約定user_id作爲外鍵。

但是,在5.4中,定義關係時不需要顯式指定外鍵。

從文檔:

就像以前Laravel的版本中,這種關係通常會使用的user_id爲外鍵。但是,如果您正在覆蓋用戶模型的getKeyName方法

Upgrading To 5.4.0 From 5.3

更新

問題可能還通過設置的值造成的行爲可能是不同於以前的版本$的PrimaryKey。 您沒有提交任何代碼。但是,假設在您的用戶模型中,您定義了$primaryKey = user_id Laravel會將列名稱附加到此密鑰名稱。因此,您會看到laravel嘗試查詢user_user_id。

只要從用戶模型中刪除$ keyname,laravel就會按照慣例user_id假定外鍵。

或者你也可以定義外鍵明確地傳遞第二個參數屬於關聯(): return $this->belongsTo(User::class, 'user_id);

+0

沒有,我只設置$的PrimaryKey在用戶模式本身。並加載我的後期模型中的關係,如下所示:public function user() { return $ this-> belongsTo(User :: class); } – Jorn

+0

設置$ primaryKey與覆蓋引起問題的getKeyName方法相同。 – Hamoud

+0

好的,但如果我沒有設置$ primaryKey,它正在我的用戶表中尋找'id'列,它不會找到,因爲我的主鍵是'user_id'。 QLSTATE [42S22]:未找到列:1054'where子句'中的未知列'id'(SQL:select * from'users',其中id' = 26 limit 1)。這意味着我必須將所有主鍵都改爲'id'。然後將primaryKey設置爲自定義值將無用 – Jorn