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()
// または public function getDependencies(): array
{
return [
'UserRolesSeed',
];
}
/**
* Run Method.
*
* @return void
*/
public function run()
// または public function run(): void
{
$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();
}
}
Seederを実行は下記です。
bin/cake migrations seed
Seederを実行したときに下記のようなエラーが出ることがあります。
Fatal error: Declaration of UsersSeed::getDependencies() must be compatible with Phinx\Seed\AbstractSeed::getDependencies(): array in /config/Seeds/UsersSeed.php on line xx
この場合、下記のように変更します。
public function getDependencies() ↓ public function getDependencies(): array public function run() ↓ public function run(): void
関連記事
- カラム一覧を取得する方法
- テンプレート(template)側でログイン情報を取得する方法
- フォームの必須エラーメッセージをHTML5標準にする方法、カスタマイズする方法
- 標準のHelperを拡張してカスタマイズする方法
- 国際化i18n(多言語化)
- URLをハイフン区切りからアンダーバー区切りやキャメルケースにする方法
- CakePHP4系の入手方法・インストール方法
- Composerコマンドでウクライナへのメッセージが表示されたことがあります
- Composerをインストールする方法と使い方
- コーディング規約のチェックを行う・整形する標準ツール(PHP CodeSniffer)の使い方
- Seedを実行した後にシーケンスを更新する方法(duplicate key valueエラー)
- SQLクエリー(SQL文)を直接実行する方法
- PostgreSQLでERROR: duplicate key value violates unique constraint "hoge_pkey" DETAIL: Key (id)=(10) already exists.と出る場合
- PostgreSQLで自動採番をするシーケンス(sequence)とは【AUTO INCREMENT】
- Apacheで所有権や書き込み権限があるにも関わらずPermissions deniedが出る場合
- CakePHP3
- CakePHP
- MySQL MariaDB
- PostgreSQL
- MySQLで文字化けを防ぐ方法
- LIMITで件数制限をしつつ、全件数を取得する方法 SQL_CALC_FOUND_ROWS FOUND_ROWS()
- EC-CUBEのサーバ移行の方法
- Windows MySQLインストール後の設定
- PDO_MYSQLをインストールする方法
- EC-CUBE2系で商品を大量にカートに入れると注文情報が抜けたりカートが消えたりする
- 4.0以前と4.1以降のパスワード方式の違い
- EC-CUBEのバックアップ機能とリストア
- データベースを定時バックアップする方法(毎日バックアップする処理)
- 文字コードを指定する方法
- CakePHP1系(CakePHP1.3)をPHP7・PHP8以降に対応させる方法
- PostgreSQLのインストール
- ディレクトリ構成
- SQL文で特定の曜日のみ抽出するには
- CakePHP5系の入手方法・インストール方法
スポンサーリンク