🙈

Laravel seederの外部キー制約の無効化/有効化

2021/12/07に公開

結論は migration と一緒で可能

use Illuminate\Support\Facades\Schema
:

Schema::disableForeignKeyConstraints();
$this->call([...]);
Schema::enableForeignKeyConstraints();

migration はともかく seeder はどうやるのか迷った

マイグレーションドキュメント(8.x)によると、

次の方法を使用して、マイグレーション内の外部キー制約を有効または無効にできます。

Schema::enableForeignKeyConstraints();

Schema::disableForeignKeyConstraints();

らしいが、 seeder でも一時的に無効化したいときのお話。

お作法的に書いていたのがこれ。

過去の案件の拾いものです。

\DB::statement('SET FOREIGN_KEY_CHECKS=0;');
$this->call([ ... ]);
\DB::statement('SET FOREIGN_KEY_CHECKS=1;');

mysql では動くんだけど・・・

他のRDBMS(Postgres) にしたら詰んだ

当然ですが。

\DB::statement('SET FOREIGN_KEY_CHECKS=0;'); // エラー!
$this->call([ ... ]);
\DB::statement('SET FOREIGN_KEY_CHECKS=1;');

grep してたどり着いた Builder メソッド

laravel の mysql glamour みたいなクラスにたどり着いたあたりで、
もしかして Builder が持ってるんじゃないかと気づいて見つけた結果がこれ。

\DB::connection()->getSchemaBuilder()->disableForeignKeyConstraints();
$this->call([ ... ]);
\DB::connection()->getSchemaBuilder()->enableForeignKeyConstraints();

もっとも、Schema::{enable,disable}ForeignKeyConstraints で事足りたので、ドキュメントを読みましょうということですね。
シーディングの章にも書いてあったらよかった。

Discussion

ログインするとコメントできます