W.D.Sphere

ウェブ開発の技術を楽しむ空間

CodeIgniter 4 マイグレーションとシーディングのチュートリアル

CodeIgniter4でのマイグレーションとシーディングの基本的な使い方を解説しています。FakerPHPを使用してサンプルデータを作成する方法も確認します。

CodeIgniter4のプロジェクトの作成

このチュートリアルではCodeIgniter4でのMigration(マイグレーション)でのデータベーステーブルの作成方法を確認し、Seeding(シーディング)でサンプルデータを挿入してデータを表示します。ブログ形式のページと顧客リスト形式のページ2つを作成して表示を確認します。サーバーはXAMPPを使用します。CodeIgniter4とFakerPHPのダウンロードにComposerを使用しますので事前にインストールしておきます。

それではまずプロジェクトを作成します。XAMPPのhtdocsに移動し下記コマンドを実行します。今回のプロジェクト名はfaker-tutorialとします。

CodeIgniter4のプロジェクトの作成

composer create-project codeigniter4/appstarter faker-tutorial

開発モードに設定していきます。テキストエディターでenvファイルを.envにリネームしCI_ENVIRONMENTをdevelopmentに、app.baseURLを'http://localhost/faker-tutorial/public'に設定します。

.env抜粋

# ENVIRONMENT
CI_ENVIRONMENT = development

# APP
app.baseURL = 'http://localhost/faker-tutorial/public'

これで開発モードに設定できました。

データベースの作成とCodeIgniter4との接続設定

データベースを作成します。このチュートリアルではデータベース名をtestdbにします。テーブルは後ほどマイグレーションで作成しますので、phpMyAdminでは下記コマンドでデータベースのみ作成します。

データベースtestdbの作成

CREATE DATABASE testdb;

データベースが作成できたのでCodeIgniter4で接続するために.envファイルのデータベースの項目を設定します。

.env抜粋

# DATABASE
database.default.hostname = localhost
database.default.database = testdb
database.default.username = root
database.default.password = root
database.default.DBDriver = MySQLi

ホスト名、データベース名、ユーザー名、パスワードはそれぞれの環境にあわせて変更してください。これでデータベースの設定も完了です。

Migrationでのデータベーステーブルの作成

それではマイグレーションでデータベーステーブルを作成していきます。ブログ形式のデータを保存するpostsテーブルを作成していきます。まずsparkコマンドでマイグレーションファイルを作成します。下記コマンドを実行します。

postsのマイグレーションクラスの作成

php spark make:migration posts --table --suffix

app/Database/Migration内に2022-01-01-042743_PostsMigration.phpといったファイルが作成されます。先頭の数字はタイムスタンプです。ひな形が作成されているので下記のように変更します。

app/Database/Migration/ [time_stamp]_PostsMigration.php

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class PostsMigration extends Migration
{
    public function up()
    {
        $this->forge->addField([
            'id' => [
                'type' => 'INT',
                'auto_increment' => true
            ],
            'title' => [
                'type' => 'VARCHAR',
                'constraint' => '100',
            ],
            'description' => [
                'type' => 'TEXT',
            ],
            'created_at datetime default current_timestamp'
        ]);
        $this->forge->addKey('id', true);
        $this->forge->createTable('posts');
    }

    public function down()
    {
        $this->forge->dropTable('posts');
    }
}

マイグレーションファイルが作成できたら下記コマンドを実行します。

マイグレーションの実行

php spark migrate

これでpostsテーブルが作成されました。

codeigniter4-faker-tutorial-01

顧客リスト形式のデータを保存するcustomersテーブルも同様に作成してみましょう。下記コマンドを実行します。

customersのマイグレーションクラスの作成

php spark make:migration customers --table --suffix

作成されたファイルを下記のようにします。

app/Database/Migration/
[time_stamp]_CustomersMigration.php

<?php

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class CustomersMigration extends Migration
{
    public function up()
    {
        $this->forge->addField([
            'id' => [
                'type' => 'INT',
                'auto_increment' => true
            ],
            'name' => [
                'type' => 'VARCHAR',
                'constraint' => '100',
            ],
            'address' => [
                'type' => 'VARCHAR',
                'constraint' => '100',
            ],
            'phone' => [
                'type' => 'VARCHAR',
                'constraint' => '20',
            ],
            'email' => [
                'type' => 'VARCHAR',
                'constraint' => '100',
            ],
            'password' => [
                'type' => 'VARCHAR',
                'constraint' => '100',
            ],
            'created_at datetime default current_timestamp'
        ]);
        $this->forge->addKey('id', true);
        $this->forge->createTable('customers');
    }

    public function down()
    {
        $this->forge->dropTable('customers');
    }
}

マイグレーションファイルが作成できたら下記コマンドを実行します。

マイグレーションの実行

php spark migrate

customersテーブルが作成されました。

codeigniter4-faker-tutorial-02

これで2つのテーブルが完成しました。

PostModelファイル、CustomerModelファイルの作成

それではそれぞれのモデルファイルを作成していきます。まず、PostModelファイルを作成します。下記コマンドを実行します。

PostModelの作成

php spark make:model Post --suffix

app/Models内にひな形が生成されるので$allowedFieldsを下記のようにします。

app/Models/PostModel.php

<?php

namespace App\Models;

use CodeIgniter\Model;

class PostModel extends Model
{
    protected $DBGroup          = 'default';
    protected $table            = 'posts';
    protected $primaryKey       = 'id';
    protected $useAutoIncrement = true;
    protected $insertID         = 0;
    protected $returnType       = 'array';
    protected $useSoftDeletes   = false;
    protected $protectFields    = true;
    protected $allowedFields    = ['title', 'description'];

    // Dates
    protected $useTimestamps = false;
    protected $dateFormat    = 'datetime';
    protected $createdField  = 'created_at';
}

CustomerModelファイルも作成していきましょう。下記コマンドを実行します。

PostModelの作成

php spark make:model Customer --suffix

app/Models内にひな形が生成されるので$allowedFieldsを下記のようにします。

app/Models/CustomerModel.php

<?php

namespace App\Models;

use CodeIgniter\Model;

class CustomerModel extends Model
{
    protected $DBGroup          = 'default';
    protected $table            = 'customers';
    protected $primaryKey       = 'id';
    protected $useAutoIncrement = true;
    protected $insertID         = 0;
    protected $returnType       = 'array';
    protected $useSoftDeletes   = false;
    protected $protectFields    = true;
    protected $allowedFields    = ['name', 'address', 'phone', 'email' ,'password'];

    // Dates
    protected $useTimestamps = false;
    protected $dateFormat    = 'datetime';
    protected $createdField  = 'created_at';
}

これでデータベースとモデルファイルが準備できたのでSeeding(シーディング)でサンプルデータを挿入していきます。

Seedingでのデータの挿入

Seeding(シーディング)とはデータベーステーブルにレコードを追加することです。Seeder(シーダー)クラスを使用するのでsparkコマンドでSeeder(シーダー)ファイルを作成します。

PostSeederの作成

php spark make:seeder Post --suffix

app/Database/Seeds内にPostSeeder.phpのひな形が作成されるので下記のようにします。

app/Database/Seeds/PostSeeder.php

<?php

namespace App\Database\Seeds;

use CodeIgniter\Database\Seeder;
use App\Models\PostModel;

class PostSeeder extends Seeder
{
    public function run()
    {
        $postModel = new PostModel;
        $postModel->save([
            'title' => '吾輩は猫である',
            'description' => '吾輩は猫である。名前はまだ無い。
            どこで生れたかとんと見当がつかぬ。
            何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。
            吾輩はここで始めて人間というものを見た。'
        ]);
    }
}

下記コマンドを実行してレコードを挿入します。

Seederの実行

php spark db:seed PostSeeder

これでPostsテーブルにレコードが一つ追加できました。

codeigniter4-faker-tutorial-03

FakerPHPの使用

Seederクラスを使用してレコードを登録することができましたが一つずつデータを入力するのは手間がかかるのでFakerPHPライブラリを使用します。まず、Composerのコマンドでライブラリをダウンロードします。

FakerPHPのダウンロード

composer require --dev fakerphp/faker

これでFakerPHPが使用できるのでPostSeeder.phpを下記のように修正します。

app/Database/Seeds/PostSeeder.php

<?php

namespace App\Database\Seeds;

use CodeIgniter\Database\Seeder;
use App\Models\PostModel;

class PostSeeder extends Seeder
{
    public function run()
    {
        $postModel = new PostModel;
        $faker = FakerFactory::create("ja_JP");

        for ($i=0; $i < 10; $i++) {
            $postModel->save([
                'title' => $faker->realText(20),
                'description' => $faker->realText(100),
                'created_at' => $faker->dateTime(),
            ]);
        }
    }
}

修正できたのでSeederを実行してみましょう。

Seederの実行

php spark db:seed PostSeeder
codeigniter4-faker-tutorial-04

サンプルデータを自動生成できたので、もう一つの顧客リスト形式のテーブルにもデータをいれておきます。Seederファイルを下記コマンドで作成します。

CustomerSeederの作成

php spark make:seeder Customer --suffix

app/Database/Seeds内にCustomerSeeder.phpが作成されるのでFakerPHPを使用して下記のようにします。

app/Database/Seeds/CustomerSeeder.php

<?php

namespace App\Database\Seeds;

use CodeIgniter\Database\Seeder;
use App\Models\CustomerModel;

class CustomerSeeder extends Seeder
{
    public function run()
    {
        $customerModel = new CustomerModel;
        $faker = FakerFactory::create("ja_JP");

        for ($i=0; $i < 25; $i++) {
            $customerModel->save([
                'name' => $faker->name(),
                'address' => $faker->address(),
                'phone' => $faker->phoneNumber(),
                'email' => $faker->email(),
                'password' => $faker->password(),
                'created_at' => $faker->dateTime(),
            ]);
        }
    }
}

CustomerSeederを実行します。

CustomerSeederの実行

php spark db:seed CustomerSeeder
codeigniter4-faker-tutorial-05

レコードが25個作成できました。

Paginationを使用するControllerの作成

ブログ形式と顧客リスト形式のサンプルデータが作成できたのでデータを表示するためのControllerとViewを作成して表示してみます。

表示の際にPagination(ページネーション)を使ってみましょう。Pagination(ページネーション)とは決まったレコード数ごとにページ付けしてくれる機能です。

それではそれぞれControllerファイルを作成します。まずPostController.phpを作成します。sparkコマンドでひな形を作成し下記のようにします。

PostController.phpの作成

php spark make:controller Post --suffix

app/Controllers/PostController.php

<?php

namespace App\Controllers;

use App\Controllers\BaseController;
use App\Models\PostModel;

class PostController extends BaseController
{
    public function index()
    {
        $postModel = new PostModel();

        $data = [
            'posts' => $postModel->paginate(3),
            'pager' => $postModel->pager
        ];

        return view('blog_view',$data);
    }
}

次にCustomerController.phpを作成します。sparkコマンドでひな形を作成し下記のようにします。

CustomerController.phpの作成

php spark make:controller Customer --suffix

app/Controllers/CustomerController.php

<?php

namespace AppControllers;

use AppControllersBaseController;
use AppModelsCustomerModel;

class CustomerController extends BaseController
{
    public function index()
    {
        $customerModel = new CustomerModel();

        $data = [
            'customers' => $customerModel->paginate(10),
            'pager' => $customerModel->pager
        ];

        return view('customer_view', $data);
    }
}

PostController.phpではレコードを3個ずつ、CustomerController.phpではレコードを10個ずつページ付けするように指定しています。コントローラが作成できたのでルーティングを設定しておきます。

app/Config/Routes.php抜粋

* Route Definitions
$routes->get('blog', 'PostController::index');
$routes->get('customer', 'CustomerController::index');

Paginationを使用するViewの作成

blog_view.phpとcustomer_view.phpを作成していきます。今回もPico.cssを使用しますが、お好みでどうぞ。blog_view.phpを下記のように作成します。

app/Views/blog_view.php

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>CodeIgniter 4 ブログ表示</title>
  <link rel="stylesheet" href="https://unpkg.com/@picocss/pico@latest/css/pico.min.css">
</head>
<body>
<div class="container">
<h1>ブログ</h1>
<?php foreach ($posts as $post): ?>
    <article>
        <header><h3><?= $post['title'] ?></h3></header>
        <?= $post['description'] ?>
        <footer><?= $post['created_at'] ?></footer>
    </article>
<?php endforeach; ?>

<?php if ($pager): ?>
    <?= $pager->links() ?>
<?php endif; ?>
</div>
</body>
</html>

customer_view.phpを下記のように作成します。

app/Views/customer_view.php

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>CodeIgniter 4 顧客リスト表示</title>
  <link rel="stylesheet" href="https://unpkg.com/@picocss/pico@latest/css/pico.min.css">
</head>
<body>
<div class="container">
<h1>顧客リスト</h1>
<table role="grid">
    <thead>
        <tr>
            <th>ID</th>
            <th>氏名</th>
            <th>住所</th>
            <th>電話番号</th>
            <th>メールアドレス</th>
            <th>パスワード</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($customers as $customer): ?>
        <tr>
            <td><?= $customer['id'] ?></td>
            <td><?= $customer['name'] ?></td>
            <td><?= $customer['address'] ?></td>
            <td><?= $customer['phone'] ?></td>
            <td><?= $customer['email'] ?></td>
            <td><?= $customer['password'] ?></td>
        </tr>
        <?php endforeach; ?>
    </tbody>
</table>

<?php if ($pager): ?>
    <?= $pager->links() ?>
<?php endif; ?>
</div>
</body>
</html>

それでは表示を確認してみましょう。XAMPPでApacheとMySQLを起動し、ブラウザでhttp://localhost/faker-tutorial/public/blogにアクセスしてブログ形式のページを確認してみましょう。

codeigniter4-faker-tutorial-06

次にhttp://localhost/faker-tutorial/public/customerにアクセスして顧客リストのページを確認してみましょう。

codeigniter4-faker-tutorial-07

どちらもページの左下にPaginationが表示されているのが確認できました。

Paginationのスタイルのカスタマイズ

デフォルトの表示のままでも良いですが少し質素なのでスタイルを調整してみます。Paginationクラスにスタイルを追加するだけでカスタマイズできます。blog_view.phpのhead内に下記のようにスタイルを追加します。

app/Controllers/PostController.php

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>CodeIgniter 4 ブログ表示</title>
  <link rel="stylesheet" href="https://unpkg.com/@picocss/pico@latest/css/pico.min.css">
  <style media="screen">
      .pagination li a {
          position: relative;
          display: block;
          margin: 0.5rem 0;
          padding: 1rem 1rem;
          color: white;
          background-color: black;
          border-radius: 0;
      }
      .pagination li.active a {
          background-color: grey;
      }
  </style>
</head>
<body>
<div class="container">
<h1>ブログ</h1>
<?php foreach ($posts as $post): ?>
    <article>
        <header><h3><?= $post['title'] ?></h3></header>
        <?= $post['description'] ?>
        <footer><?= $post['created_at'] ?></footer>
    </article>
<?php endforeach; ?>

<?php if ($pager): ?>
    <?= $pager->links() ?>
<?php endif; ?>
</div>
</body>
</html>

これでページネーションの部分のスタイルが変更できました。

codeigniter4-faker-tutorial-08

今回のチュートリアルは以上となります。Codeigniter4でのデータベース操作とページネーションの基本を確認しました。Codeigniter4に興味のある方の参考になれば幸いです。


< Previous ArticleNext Article >
Back to Articles
©2025 W.D.Sphere All Rights Reserved.