2017-03-17 96 views
0

我已經和有趣的場景,我想在Laravel 5中實現。我有2個表格。Laravel 5雄辯的雙向外鍵遷移

  1. 用戶(存放在站點的用戶)

  2. 媒體(盛放網站圖片,文檔,SVG-S,等...)

我的技術限制是:

  1. 每位用戶都有一張個人資料圖片,只有一張個人資料圖片
  2. 個每個媒體有一個作者

這些約束上我解釋上 用戶表有一欄 作爲邏輯列 - profile_image_id(參照媒體表中的id列) 媒體表中有一欄 - AUTHOR_ID(參考Users表id列)

這可以很好地工作,但當我想使用手工遷移時會變得有問題。

我的遷移順序

  1. 遷移用戶表
  2. 遷移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遷移中?

+0

使用其他遷移創建兩個表後創建外鍵。如果在播種時出現外鍵約束錯誤,您可以運行'DB :: statement('SET FOREIGN_KEY_CHECKS = 0;');'。 – TheFallen

回答

1

簡單的方式讓foriegn鍵laravel

public function up() 
{ 
    Schema::create('bank_user_details', function (Blueprint $table) { 
     $table->foreign('country')->references('id')->on('country') 
         ->onUpdate('cascade')->onDelete('cascade'); 

    }); 
}