2017-06-02 49 views
0

我正在嘗試使用外鍵創建'參賽隊'表,但如何將外鍵設置爲可空?在這種情況下可能有一個可爲空的外鍵嗎?

Schema::create('teams', function (Blueprint $table) { 
    $table->increments('id'); 
    $table->string('name')->unique(); 
    $table->string('place'); 
    $table->string('competition')->nullable()->default(null); 
    $table->foreign('competition')->references('name')->on('competitions')->onDelete('set null'); 
    $table->timestamps(); 
}); 

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

外鍵需要unqiue價值觀,否則你怎麼知道這是which.You需要一個多對多的關係 - 一個團隊可以進入很多比賽,比賽主辦CA很多球隊 - 創建一箇中間表競爭隊伍與外鍵到這兩個表。 – Mihai

回答

1

這是可以接受的FK是空的,它只是意味着你的球隊不屬於競爭又那麼我認爲你有正確的想法。我猜測你得到一個錯誤,因爲你正在創建competitions表之前,試圖將你的teams表與competitions表聯繫起來。

先創建competitions表。您可能需要先刪除teams表,如果它已創建並嘗試再次運行遷移。

這也可能是與name列相關的問題。理想情況下,您應該將該列指定爲competition_id而不是competition,並將其與competitions表中的id列相關聯。讓比賽中的name專欄像你一樣擁有獨特的效果,但查詢可能會比較慢,因爲它在varchar上創建了一個更大的索引。

如果您在name專欄上做了這項工作,如果您需要更新競賽名稱,您可能會有更多的問題。如果你關於ID,這應該永遠不會成爲問題,因爲你通常不會更改ID。我認爲你仍然可以這樣工作,你只需要在你的FK上添加一個onUpdate('cascade')

+0

有辦法以某種方式確定遷移的優先順序嗎? – jordibenck

+0

既然你在遷移中都有這些,只需將'競賽表'向上移動即可。如果這些是在不同的遷移中,請從「團隊」遷移中刪除密鑰,並在創建「競爭」的新遷移中創建表,然後在該遷移中創建外鍵。否則,您可以手動更改遷移文件名的時間戳並再次運行它們,儘管這可能會導致數據庫出現問題。您可能需要截斷遷移表並刪除所有表,然後再遷移。 – user3158900

0

您只需要先創建competitions表,然後再創建teams表。

0

嘗試這樣的:

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

Schema::create('teams', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name')->unique(); 
     $table->string('place'); 
     $table->string('competition')->nullable()->default(null); 
     $table->timestamps(); 
}); 

Schema::table('teams', function (Blueprint $table) { 
    $table->foreign('competition')->references('name') 
     ->on('competitions')->onDelete('set null'); 
}); 
相關問題