我已經和有趣的場景,我想在Laravel 5中實現。我有2個表格。Laravel 5雄辯的雙向外鍵遷移
用戶(存放在站點的用戶)
媒體(盛放網站圖片,文檔,SVG-S,等...)
我的技術限制是:
- 每位用戶都有一張個人資料圖片,只有一張個人資料圖片
- 個每個媒體有一個作者
這些約束上我解釋上 用戶表有一欄 作爲邏輯列 - profile_image_id(參照媒體表中的id列) 媒體表中有一欄 - AUTHOR_ID(參考Users表id列)
這可以很好地工作,但當我想使用手工遷移時會變得有問題。
我的遷移順序
- 遷移用戶表
- 遷移MEDIA表運行
我的移民有設定外鍵
USERS遷移
$table->foreign('profile_image_id')->references('id')->on('media')->onDelete('restrict')->onUpdate('cascade');
MEDIA遷移
$table->foreign('author_id')->references('id')->on('users')->onDelete('restrict')->onUpdate('cascade');
我使用的命令是
php artisan migrate:refresh --seed
的問題是,在創建用戶表時,媒體表中不存在的呢。當試圖將外鍵關係添加到媒體表時,它會產生媒體表不存在的SQL錯誤。
我做了什麼?
我創建了用戶表遷移的功能,我追着直播功能已經完成
/**
* Veyzon
*
* To be run after the regular run functions on all tables
* have run
*/
public static function delayed_up() {
Schema::table('users', function (Blueprint $table) {
$table->foreign('profile_image_id')->references('id')->on('media')->onDelete('restrict')->onUpdate('cascade');
});
}
此制定了罰款和花花公子,但重新遷移時,那麼媒體表不會刪除因事實用戶表仍然有記錄,其中有值爲profile_image_id-s。
現在我想我會添加幾行代碼到媒體表「下」功能,這將設置所有USERS表profile_media_id-s爲空,但我不太喜歡這個,因爲這似乎配合我將單獨的遷移文件放在一起,當我將其聲明爲架構正常的時候,那麼這將成爲一種不好的做法。
你們會做什麼,創建雙向一對一外鍵關係並將它們整合到Laravel遷移中?
使用其他遷移創建兩個表後創建外鍵。如果在播種時出現外鍵約束錯誤,您可以運行'DB :: statement('SET FOREIGN_KEY_CHECKS = 0;');'。 – TheFallen