CakePHP3でテーブルにカラム(項目)を追加したときに変更するポイントのまとめ
2019/06/08
CakePHP3でテーブルにカラムを追加したときに変更するポイント
システム開発途中でカラムの追加はよくある話
CakePHP3でシステムを開発するとき、Bakeを使ってベースとなる処理を作成しておくと作業を効率化することができます。
ですが、システム開発においては、途中でテーブルにカラムを追加する必要性が生まれることは日常茶飯事です。
開発があまり進んでいないときならば、テーブルにカラムを追加して Bakeからやり直す、という方法もありですが、相応に開発が進んでいたら、Bakeからやり直すのは非効率的ですし、バグが混入することにもなりかねません。
というわけで、テーブルにカラムを追加する前と後とで、Bakeして生成される Controller、Model、Templateファイルがどう変わるのか、を確認して、カラムを追加したときは何を変更すべきなのか、を明確にしていきます。
これを見て変更点をチェックすれば、カラムを追加しても抜けもれなく対応できます!
(処理の内容を理解していれば、修正すべき個所は分かるハズではあるんですが...)
作成するテーブルのサンプル
まず、最初に作成したテーブルは下記のとおりです。
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE `tests` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `user_id` char(36) NOT NULL, `url` varchar(100) NOT NULL, `new_url` varchar(100) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `new_url_text` (`new_url`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 |
これに対して、下記の ALTER TABLEで削除フラグのカラム「deleted」を追加します。
1 |
ALTER TABLE tests ADD deleted tinyint default null AFTER new_url; |
Bakeで作成されるファイル
Bakeを実行して作成されるファイルは、以下となります。
Bakeを再実行する際に「Do you want to overwrite? (y/n/a/q)」との確認があるファイルでもあります。
/src/Model/Table/TestsTable.php
/src/Model/Entity/Test.php
/tests/Fixture/TestsFixture.php
/tests/TestCase/Model/Table/TestsTableTest.php
/src/Controller/TestsController.php
/tests/TestCase/Controller/TestsControllerTest.php
/src/Template/Tests/index.ctp
/src/Template/Tests/view.ctp
/src/Template/Tests/add.ctp
/src/Template/Tests/edit.ctp
更新された内容は以下の通りとなります。
/src/Model/Entity/Test.php
13行目のコメント行が追加になっています。
1 |
* @property int|null $deleted |
34行目が追加になっています。
1 |
'deleted' => true, |
/src/Model/Table/TestsTable.php
74、75行目が追加になっています。
1 2 |
$validator ->allowEmptyString('deleted'); |
/src/Template/Tests/index.ctp
24行目が追加になっています。
1 |
<th scope="col"><?= $this->Paginator->sort('deleted') ?></th> |
37行目が追加になっています。
1 |
<td><?= $this->Number->format($test->deleted) ?></td> |
/src/Template/Tests/view.ctp
38~41行目が追加になっています。
1 2 3 4 |
<th scope="row"><?= __('Deleted') ?></th> <td><?= $this->Number->format($test->deleted) ?></td> </tr> <tr> |
/src/Template/Tests/add.ctp
23行目が追加になっています。
1 |
echo $this->Form->control('deleted'); |
/src/Template/Tests/edit.ctp
29行目が追加になっています。
1 |
echo $this->Form->control('deleted'); |
/tests/Fixture/TestsFixture.php
22行目が追加になっています。
1 |
'deleted' => ['type' => 'tinyinteger', 'length' => 4, 'unsigned' => false, 'null' => true, 'default' => null, 'comment' => '', 'precision' => null], |
42~52行目の、48行目が追加、45、49、50行目が変更になっています。
1 2 3 4 5 6 7 8 9 10 11 |
$this->records = [ [ 'id' => 1, 'user_id' => 'bc984858-445f-4cc1-adff-65441c360e2e', 'url' => 'Lorem ipsum dolor sit amet', 'new_url' => 'Lorem ipsum dolor ', 'deleted' => 1, 'created' => '2019-04-11 22:37:23', 'modified' => '2019-04-11 22:37:23' ], ]; |
テーブルの構造を変更しても、Controllerは変更されていません。
テーブル構造を変更した場合の対応は、Modelの Entityと Tableのファイルでした。
Templateも変更がありますが、こちらは、必要に応じて項目を追加するといいでしょう。
テーブル構造を変更した場合はキャッシュをクリアする
テーブルの構造を変更した場合は、キャッシュをクリアしましょう。
キャッシュのクリア方法は、CakePHP 3.3以降であれば、下記のコマンドが便利です。
1 |
$ bin/cake cache clear_all |
詳しくは、「CakePHP3、CakePHP4のキャッシュをクリアする方法「bin/cake cache clear_all」を使う」に記事を書いていますので、参考にしてください。
関連テーブルがある時、ない時とでの記述内容の違い
アソシエーションしたテーブル(関連付けされたテーブル)がある場合は、関連テーブルを createする前に bakeする場合と、createしてから bakeした場合とでも作成されるファイルがやや違うことも確認しました。
差異があるファイルの内容は、以下の通りです。
/src/Template/Tests/add.ctp
1 2 3 4 5 6 |
<ul class="side-nav"> <li class="heading"><?= __('Actions') ?></li> <li><?= $this->Html->link(__('List Tests'), ['action' => 'index']) ?></li> <li><?= $this->Html->link(__('List Users'), ['controller' => 'Users', 'action' => 'index']) ?></li> <li><?= $this->Html->link(__('New User'), ['controller' => 'Users', 'action' => 'add']) ?></li> </ul> |
上記の 4、5行目が追加になっています。
これは、「add.ctp」の 17行目、18行目ですが、「Tests」の画面でも「Users」への関連リンクが追加されています。
1 2 3 |
echo $this->Form->control('user_id', ['options' => $users]); echo $this->Form->control('url'); echo $this->Form->control('new_url'); |
また、上記の 1行目も下記のように変更されています。
1 2 3 4 5 |
// 変更前 echo $this->Form->control('user_id'); // 変更後 echo $this->Form->control('user_id', ['options' => $users]); |
画面を表示させると分かるのですが、変更前はテキスト形式の入力ボックスなのですが、変更後はプルダウン形式に変更されています。
add.ctpと同じ様に、edit.ctp、index.ctp、view.ctpも同じような趣旨の変更が加わっています。
/src/Model/Entity/Test.php
16行目のコメントが下記のように変更になっています。
1 2 3 4 5 |
// 変更前 * @property \App\Model\Entity\User $user // 変更後 * @property \CakeDC\Users\Model\Entity\User $user |
/src/Model/Table/TestsTable.php
12行目のコメントが下記のように変更になっています。
1 2 3 4 5 |
// 変更前 * @property \App\Model\Table\UsersTable|\Cake\ORM\Association\BelongsTo $Users // 変更後 * @property \CakeDC\Users\Model\Table\UsersTable|\Cake\ORM\Association\BelongsTo $Users |
/tests/Fixture/TestsFixture.php
/tests/Fixture/TestsFixture.php も更新されていましたが、44、47、48行目のデータの値でしたので、ここでの説明は割愛します。
関連テーブルを作成する前後での違いを検証するつもりはありませんでした。
ですが、「tests」に CakeDC/Usersの user_idと連携させるためのカラムがあることを忘れていて、「tests」だけで Bakeをしてしまったため、「『user_id』に関連するテーブルがない」というエラーが表示されてしまいました。
そのため、ついでに確認をしてみることにした次第です。
CakePHP3の関連記事
CakePHP4のCSS、JavaScript、画像のブラウザへのキャッシュをコントロールするCakePHP3でレコードを保存(追加、更新、Insert、Update)する複数の方法を紹介
CakePHP3でモデルなしフォームからCSVをアップロードしレコードを更新する方法解説
CakePHP3でPHP Simple HTML DOM Parserを使ってスクレイピングする方法
CakePHP3のInsert On Duplicate Key Update(upsert)構文を解説・バルク処理も
CakePHP3の1対多での連携を中間テーブルを使った多対多の連携に変更するときの手順
CakePHP3でデフォルトのソート条件を設定してユーザの選択肢たソート条件を有効にする方法
CakePHP3で Ajaxを使う方法の解説。3.6以降対応。Successとthenの両方を解説。
CakePHP3でパンくずの指定は HTMLヘルパーを使って指定する方法を解説
CakePHP3にOGPをfetch、asignを利用してテンプレートごとに指定する方法を解説
その他の「CakePHP3」に関する記事一覧
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
-
CakePHP3のCakeDC/Users、Authでログインなしでもアクセスを許可する設定
CakePHP3の Authコンポーネントや CakeDC/Usersプラグインなどを利用したユーザ管理・認証システムにおいて、ログインしていなくても見ることができるページの設定方法を解説。
-
-
MySQL+CakePHPのdate型、datetime型項目は「2999-12-31」までしか扱えない
CakePHPの日付、日時の型であるdate型、datetime型の最大値は2999-12-31となっている。MySQLは9999年までなので違いがあるので注意が必要だ。
-
-
CakePHP3でユーザ定義の定数、変数を設定し、読み込む方法解説
CakePHP3で定数や共通で使う変数をまとめて設定し、プログラム内で読み込む方法を、bootstrap.phpに直接記述する方法と定数ファイルを分ける方法の3つの方法で解説。
-
-
CakePHP3でシェルを作成しコマンドラインから実行・CakePHP2との違い
CakePHP3のシェルスクリプトを作成し、コマンドラインから実行する方法を解説。複数単語をつなげる場合の対応方法がCakePHP2より制限が厳しくなったのでCakePHP3の命名規則の確認が必要だ。
-
-
CakePHP3、CakePHP4のキャッシュをクリアする方法「bin/cake cache clear_all」を使う
CakePHP3、CakePHP4では処理を高速化する手法の一つとしてキャッシュを利用している。しかし、その情報は元の情報を更新しても反映されない場合がある。そんなときはキャッシュを削除する必要がある。
-
-
CakePHP 2.3 bakeの超初心者向けフォロー講座
CakePHP 2.3 bakeの超初心者向けフォロー講座
-
-
CakePHP3のCakeDC/Usersの画面、メール本文テンプレートのカスタマイズ方法解説
CakeDC謹製Usersプラグインの紹介。ユーザ新規登録の流れを紹介しつつテンプレートファイルがどこにあるか、設定情報ファイルがどこにあるか、を説明しつつカスタマイズの方法を解説します。
-
-
CakePHP 2.3 ID以外のカラムでアソシエーション(連携)をさせる場合の詳細ページの注意点
ID以外のカラムでアソシエーション(連携)させて詳細ページを表示させる際の考え方と注意点をサンプルソースを用いて解説しています。
-
-
CakePHP 2.3でOn Duplicate Key構文を実装
CakePHPで On Duplicate Key構文を Queryを利用して実装する方法をサンプルソース付きで解説します。
-
-
CakePHP3、CakePHP4、CakePHP5のバージョンを指定してインストールする詳細な手順を解説
CakePHP3のバージョンを指定してインストールする方法を詳細解説。CakePHP3のインストールはComposerを使うため設定もほぼ自動で完了。データベースの接続情報を記載すればアプリ開発のベースが整う。