🙈
Laravel seederの外部キー制約の無効化/有効化
結論は 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