Seedの実行順(外部キー制約などを先に実行させる方法) Foreign key violation

Seedは通常はファイル名の順に実行されます。

実行させたい順が決まっている場合、
A01Seed.php クラス名A01Seed
A02Seed.php クラス名A02Seed
……

のようにすると、名前順に実行されます。
(class名は数字で始めることはできない)

Seedの実行順によっては外部キー制約などで次のようなエラーが出ることがあります。

[PDOException] SQLSTATE[23503]: Foreign key violation: 7 ERROR:  insert or update on table "users" violates foreign key constraint "users_role_id_fkey"
DETAIL:  Key (role_id)=(1) is not present in table "roles". in /cake/vendor/robmorgan/phinx/src/Phinx/Db/Adapter/PdoAdapter.php on line 335

外部キー制約を使用するなどして、Seedの実行順が決まっている場合はgetDependencies()メソッドで依存関係を指定すると先に外部キーのテーブルのSeedを実行させることができます。
Seedは名前順に実行されると定義されているわけではないので、外部キー制約がある場合はgetDependencies()メソッドを指定しておいたほうがいいです。

<?php
declare(strict_types=1);

use Migrations\AbstractSeed;

/**
 * Users seed.
 */
class UsersSeed extends AbstractSeed
{
    /**
     * Return seeds dependencies.
     *
     * @return array
     */
    public function getDependencies()
    {
        return [
            'UserRoles',
        ];
    }

    /**
     * Run Method.
     *
     * @return void
     */
    public function run()
    {
        $data = [
            [
                'id'           => 1,
                'email'        => 'test@example.com',
                'name'         => 'テスト太郎',
                'user_role_id' => 1,
            ],
            [
                'id'           => 2,
                'email'        => 'hoge@example.com',
                'name'         => 'ほげほげ',
                'user_role_id' => 2,
            ],
        ];

        $table = $this->table('users');
        $table->insert($data)->save();
    }
}

関連記事

スポンサーリンク

mdir MS-DOSファイルやディレクトリの情報を表示

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る