[CakePHP]Article-Pluginを作ってみる2(DBテーブルとschema.phpを作成する)

Article-Pluginで使用するデータベーステーブルと、schema(スキーマ)ファイルを作成します。

通常はschemaファイルを作成してから、cake schema createでテーブルを作るのが一般的だと思いますが、私の場合はNavicatというデータベース管理ソフトを使っているので、先にテーブルを作ってしまいます。

今回は、テーブルを作成し、schemaファイルを作成するところを記事にします。
schemaファイルからテーブルを作成したり、更新する方法も書くので、schema作成→テーブル作成の一般的なフローでも参考になると思います。

データベーステーブルを作成する

とりあえず記事を格納するarticlesテーブルと記事のカテゴリーマスタとなるarticle_categoriesテーブルを作成します。

あとあとはタグ付けにも対応する予定ですが、タグ関連のテーブルは後々検討したいと思います。*1

テーブルの構成はschemaを見ていただいた方が早いと思いますので、ここではテーブルを作成したことにして、次に進みます。

navicat以外にもPHPMyAdminや、MySQLのクライアントソフトをいろいろ試してみた ‐ あわわうぇbさんで紹介されているようなフリーのDB管理ソフトもあるので、先にテーブルを作りたい方は活用してみてください。

テーブルを元にschemaファイルを生成する

テーブルを作成したら、次にschemaファイルを作成します。

データベースを使用するプラグインの場合は、利用者にテーブルを用意してもらう必要があります。

schemaファイルを用意しておくと、schema createで簡単にテーブルを作成することができるので、データベースを使うプラグインを作成する場合は必須でしょう。

すでに存在するテーブルからschemaファイルを作成するには、/lib/Cake/console/cakeにパスが通った状態でコンソールから以下のコマンドを実行します。

cake schema generate -p Article

今回はArticleプラグインのschemaファイルを作成するために -p Articleというオプションを追加しているので、schemaファイルは/Plugin/Article/Config/Schema/schema.phpに作成されます。

プラグインではなくアプリケーションのschemaファイルを作成する場合は、

cake schema generate

のように、オプションを省略すればapp/Config/Schema/にschema.phpが作成されます。

今回作成されたschema.phpはこんな感じです。
/app/Plugin/Article/Config/Schema/schema.php

<?php 
class ArticleSchema extends CakeSchema {

	public function before($event = array()) {
		return true;
	}

	public function after($event = array()) {
	}

	public $article_categories = array(
		'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'primary'),
		'name' => array('type' => 'string', 'null' => false, 'default' => null, 'key' => 'unique', 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
		'sort' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'index'),
		'deleted' => array('type' => 'boolean', 'null' => false, 'default' => null),
		'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
		'modified' => array('type' => 'datetime', 'null' => true, 'default' => null),
		'indexes' => array(
			'PRIMARY' => array('column' => 'id', 'unique' => 1),
			'unq_name' => array('column' => 'name', 'unique' => 1),
			'sort' => array('column' => 'sort', 'unique' => 0)
		),
		'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'InnoDB')
	);
	public $articles = array(
		'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'key' => 'primary'),
		'title' => array('type' => 'text', 'null' => false, 'default' => null, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
		'content' => array('type' => 'text', 'null' => false, 'default' => null, 'collate' => 'utf8_general_ci', 'charset' => 'utf8'),
		'article_category_id' => array('type' => 'integer', 'null' => false, 'default' => null, 'length' => 4),
		'published' => array('type' => 'boolean', 'null' => false, 'default' => '1', 'comment' => '公開設定(下書きなら0)'),
		'deleted' => array('type' => 'boolean', 'null' => false, 'default' => '0'),
		'posted' => array('type' => 'datetime', 'null' => false, 'default' => null, 'comment' => '公開日時'),
		'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
		'modified' => array('type' => 'datetime', 'null' => true, 'default' => null),
		'indexes' => array(
			'PRIMARY' => array('column' => 'id', 'unique' => 1)
		),
		'tableParameters' => array('charset' => 'utf8', 'collate' => 'utf8_general_ci', 'engine' => 'InnoDB')
	);
}

上記を参考に先にschema.phpを作ってしまえば、これを元にテーブルを作成することができます。

せっかくですからschemaファイルからテーブルを作成する方法も見てみましょう。

Schemaファイルからテーブルを作成する

schemaファイルを元にテーブルを作成するにはコンソールから以下のコマンドを実行します。

cake schema create -p Article

コマンドを実行するとschemaファイルに書かれたテーブルの定義ごとに「Are you sure you want to drop the table(s)? (y/n) 」と聞かれますので、yをタイプしてエンターでテーブルを作成していきます。

実に簡単ですね!

schemaコマンドには他にも便利な機能がありますのでご紹介します。

テーブル作成用のSQLクエリを生成する

コンソールから

cake schema dump (-p Article)

で、schemaファイルに定義したテーブルを生成するためのSQLクエリを生成してくれます。

作成されるクエリはこんな感じ。

DROP TABLE IF EXISTS `whiskey`.`article_categories`;
DROP TABLE IF EXISTS `whiskey`.`articles`;


CREATE TABLE `whiskey`.`article_categories` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
	`sort` int(11) NOT NULL,
	`deleted` tinyint(1) NOT NULL,
	`created` datetime DEFAULT NULL,
	`modified` datetime DEFAULT NULL,	PRIMARY KEY  (`id`),
	UNIQUE KEY `unq_name` (`name`),
	KEY `sort` (`sort`)) 	DEFAULT CHARSET=utf8,
	COLLATE=utf8_general_ci,
	ENGINE=InnoDB;

CREATE TABLE `whiskey`.`articles` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`title` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
	`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
	`article_category_id` int(4) NOT NULL,
	`published` tinyint(1) DEFAULT '1' NOT NULL COMMENT '公開設定(下書きなら0)',
	`deleted` tinyint(1) DEFAULT '0' NOT NULL,
	`posted` datetime NOT NULL COMMENT '公開日時',
	`created` datetime DEFAULT NULL,
	`modified` datetime DEFAULT NULL,	PRIMARY KEY  (`id`)) 	DEFAULT CHARSET=utf8,
	COLLATE=utf8_general_ci,
	ENGINE=InnoDB;

ここで生成したSQLクエリをPHPMyAdminのインポートやSQL欄にコピペして実行すればテーブルを作成できるので、プラグイン配布の際にはschemaファイルと合わせて、readmeなどにクエリを貼り付けておいてもいいかもしれません。

schemaファイルからテーブル構造を更新する

コンソールから

cake schema update (-p Article)

で、schemaファイルの内容にテーブルを更新することができます。

フィールドを追加したり、データ型を変更したい場合などはschemaファイルを編集して上記のコマンドを実行しましょう。

ちなみに私の場合はテーブルを先に直してしまって、その後schema generateを実行して既存のschemaを上書きしています。

schema generateには-sでスナップショットを取るオプションも用意されています。
このオプションを使うと既存のschema.phpを上書きすること無く別名でshemaファイルを生成してくれるので、もとのschema.phpを上書きしたくない場合はこのオプションを利用するとよいでしょう。あとでdiffを見たりするのにも活用出来ます。

CakePHPにはschema以外にもコンソールから利用できる様々な便利コマンドが用意されています。

cakephpのコマンドをまとめた! – 田舎の技術者が奮闘中さんでは、CakePHPで使えるコマンドをまとめて紹介してくれているので非常に参考になりました。(ありがとうございます!)

どんなコマンドがあるのかな?と気になった方はぜひ見てみてください。

あとがき

今回は、記事テーブルと記事カテゴリーテーブルを作成しましたが、後でテーブルやフィールドを追加したり、インデックスを貼り直したりすることになるので、schemaコマンドには何度もお世話になると思います。

実はschemaコマンドなんて今までほとんど使ったことが無かったのですが、今回記事を書くためにひと通り使ってみて便利さを実感しました。

DB管理ツールを使っていると開発環境と本番環境の同期をとるのは容易なので、schemaを使う必要性を感じませんでしたが、プラグインの様に既存のアプリケーションに後で追加するような場合にはschemaを使ったテーブル作成はとても便利ですね。

今回までのコミットをGitHubにpushしましたので、よかったら見てみてください。
happyquality/CakePHP-Article-Plugin ? GitHub

GitHub(というかgit)の使い方がよくわかっていないので、「こうしたほうがいいよ」とかお気づきのことがありましたらぜひ教えて下さい。

それではまた次回、よろしくお願いします。

  1. 既存のプラグインでタグ付けを便利にするプラグインがあったと思おうので連携できないかな?なんて思ってます。現時点で方法がわからないのでとりあえず後回し。 []
スポンサーリンク
336x280_1
336x280_1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
336x280_1