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テーブルが作成されました。
顧客リスト形式のデータを保存する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テーブルが作成されました。
これで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テーブルにレコードが一つ追加できました。
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
サンプルデータを自動生成できたので、もう一つの顧客リスト形式のテーブルにもデータをいれておきます。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
レコードが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にアクセスしてブログ形式のページを確認してみましょう。
次にhttp://localhost/faker-tutorial/public/customerにアクセスして顧客リストのページを確認してみましょう。
どちらもページの左下に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でのデータベース操作とページネーションの基本を確認しました。Codeigniter4に興味のある方の参考になれば幸いです。