【市場価値がわかる】エンジニア転職におすすめなサイト

cakePHP4でseeder(シーダー)を実行する方法を解説

cakephp4seederサムネ

cakePHP4でseeder(シーダー)を実行するにはどうしたらいいんだろう…

こんな疑問を解決します。

マイグレーションでテーブルを作成し、データを1件1件入れていくのもいいです。

が、seeder(シーダー)を活用すればもしテーブルのデータが消えてもseederファイルを実行するだけでデータを投入できます。

【開発環境】
PHP8.1
cakePHP4

事前にitemsテーブルを作成しておきましょう。↓itemsテーブルの中身

itemsテーブル
Contents

cakePHP4でseederファイルを作成する

bakeコマンドでseederファイルを作成しましょう。

$ bin/cake bake seed シーダーファイル名

config > Seeds > にItemsSeed.phpが作成されます。
※シーダーファイル名は、できるだけテーブル名に合わせた方がいいです。

bin/cake bake seed Items   

Creating file /var/www/html/config/Seeds/ItemsSeed.php
Wrote `/var/www/html/config/Seeds/ItemsSeed.php`

seederファイルを編集します。

<?php
declare(strict_types=1);

use Migrations\AbstractSeed;

/**
 * Items seed.
 */
class ItemsSeed extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeds is available here:
     * https://book.cakephp.org/phinx/0/en/seeding.html
     *
     * @return void
     */
    public function run()
    {
        // itemsテーブルを指定
        $table = $this->table('items');

        // テーブルのデータを空にする
        $table->truncate();

        // データ
        $data = [
            [
                'id'         => 1,
                'name'       => 'iphone',
                'price'      => 120000,
                'published'  => 1,
                'created_at' => '2022-03-07 12:00:00',
                'updated_at' => null,
            ],
            [
                'id'         => 2,
                'name'       => 'Mac',
                'price'      => 200000,
                'published'  => 1,
                'created_at' => '2022-03-07 13:00:00',
                'updated_at' => null,
            ],
            [
                'id'         => 3,
                'name'       => 'book',
                'price'      => 2000,
                'published'  => 0,
                'created_at' => '2022-03-07 14:00:00',
                'updated_at' => null,
            ],
        ];

        // itemsテーブルにデータをインサート
        $table->insert($data)->save();
    }
}

seederファイルを実行します。

$ bin/cake migrations seed
using migration paths 
 - /var/www/html/config/Migrations
using seed paths 
 - /var/www/html/config/Seeds
using migration paths 
 - /var/www/html/config/Migrations
using seed paths 
 - /var/www/html/config/Seeds
using environment default
using adapter mysql
using database cakephp4_tests

 == ItemsSeed: seeding
 == ItemsSeed: seeded 0.1615s

All Done. Took 0.1872s

成功しました。

itemsテーブルを確認すると、しっかりとデータが入っていますね。

seederファイル名とテーブル名が異なる場合

以下のように書きます。

$ bin/cake bake seed 任意のseederファイル名 --table テーブル名

ex.
$ bin/cake bake seed ItemData --table items

これで、config > Seeds > にItemData.phpができますが、指定するテーブルはitemsテーブルになります。

もし、–table itemsをつけなかった場合、指定するテーブルがitem_dataとなり、「そんなテーブルねえからな!」と言われるでしょう。

–tableオプションをつけなかった場合でも、$table = $this->table(‘テーブル名’);とすれば大丈夫です。

seederファイルで外部キーがある場合の対応

外部キーがある場合、truncateを実行するとエラーになる場合があるようです。

なので、truncateする前にSET FOREIGN_KEY_CHECKS = 0を使うのがポイント。
※truncateした後は、SET FOREIGN_KEY_CHECKS = 1をはる。

<?php
declare(strict_types=1);

use Migrations\AbstractSeed;

/**
 * Items seed.
 */
class ItemsSeed extends AbstractSeed
{
    /**
     * Run Method.
     *
     * Write your database seeder using this method.
     *
     * More information on writing seeds is available here:
     * https://book.cakephp.org/phinx/0/en/seeding.html
     *
     * @return void
     */
    public function run()
    {
        // itemsテーブルを指定
        $table = $this->table('items');

        // 外部キー制約取消し
     $table->execute('SET FOREIGN_KEY_CHECKS = 0');

        // テーブルのデータを空にする
        $table->truncate();

        // 外部キー制約取消し
     $table->execute('SET FOREIGN_KEY_CHECKS = 1');

        // データ
        $data = [
            [
                'id'         => 1,
                'name'       => 'iphone',
                'price'      => 120000,
                'published'  => 1,
                'created_at' => '2022-03-07 12:00:00',
                'updated_at' => null,
            ],
            [
                'id'         => 2,
                'name'       => 'Mac',
                'price'      => 200000,
                'published'  => 1,
                'created_at' => '2022-03-07 13:00:00',
                'updated_at' => null,
            ],
            [
                'id'         => 3,
                'name'       => 'book',
                'price'      => 2000,
                'published'  => 0,
                'created_at' => '2022-03-07 14:00:00',
                'updated_at' => null,
            ],
        ];

        // itemsテーブルにデータをインサート
        $table->insert($data)->save();
    }
}

>>転職するのにおすすめのサイトはこちらをクリック
>>副業で稼ぐためにおすすめのサイトはこちらをクリック

スキルを売り買いするならココナラ

オンライン動画学習ならUdemy

コメント

コメントする

CAPTCHA


Contents
閉じる