外部キー制約(参照整合性制約)の制御について
外部キー制約(参照整合性制約)の制御方法についてです。
※Udemyの(【Laravel】データーベース操作「Eloquent・クエリビルダー」マスターコース)の補足になります。
// ■外部キーを追加する場合(up)
// 規約通りの場合はこれでOK。usersテーブルのidをgamesのuser_idとして外部キーとする。
// user_idカラムが存在しない場合は、カラムも作成してくれる。
$table->foreignId('user_id')->constrained();
// 規約外の場合
$table->foreignId('user_id')->constrained('users_detail');
// 更新をカスケードします。(usersテーブルのidが更新された場合に、gamesテーブルのuser_idも更新される)
$table->foreignId('user_id')->constrained()->cascadeOnUpdate();
// 更新を制限します。(usersテーブルのidを変更できない)
$table->foreignId('user_id')->constrained()->restrictOnUpdate();
// 削除をカスケードします。
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
// 削除を制限します。
$table->foreignId('user_id')->constrained()->restrictOnDelete();
// 削除時に外部キーへNULLをセットします。(usersテーブルのidが削除された場合に、gamesテーブルのuser_idにNULLにする)
$table->foreignId('user_id')->constrained()->nullOnDelete();
// こちらは簡易的な方法です。
$table->foreignId('user_id')->constrained()->onUpdate('cascade');
$table->foreignId('user_id')->constrained()->onDelete('cascade');
// ■外部キーを削除する場合(down)
// 外部キーの名前がわからなくても、外部キーに利用しているidを指定することでも削除できます。
$table->dropForeign(['user_id']);
// 外部キーの名前を入れて削除します。
// 上記の外部キーのid指定で削除出来ない場合は、外部キーの名前を入れて削除する必要があります。
// 理由は現在不明ですが、たまに上記だと失敗する事があるので、おそらくこちらの方法を利用したほうが良いかと思います。
$table->dropForeign('games_user_id_foreign');
外部キーの名前を確認する方法
// こちらのコマンドでターミナル上からmysqlにアクセス出来ます。
sail mysql
// index情報を確認出来ます。
show index from games;
// create table情報を確認出来ます。
SHOW CREATE TABLE games;