現在、仕事ではなく個人的な用途でCodeIgniterを使っています。既存のコンテンツのCMS脱却を図ろうとしているためです(CMSでないほうが楽な場合のほうが多い。ブログは除く)。
CodeIgniterはシンプルなMVCモデルのフレームワークなのですが、Modelを使わない場合はわかりやすいテンプレート型のCMSとして活用できるな!と思ったので、これを採用しました。
しかし、データベースを使ったアプリ部分も新たに追加しようかなと思ったので、Modelも使ってみようかなと思い、調べていました。仕事でRailsをやるようになったので、CodeIgniterにもMigrationのような機能はないかなー?と思って調べてみたところ、ありました。でもまだ日本語のマニュアルはなさげです。
英語マニュアルにリンクをはっときます。
CodeIgniter User Guide Version 2.1.2 : Migration Class
- まず、application/config/migration.phpの$config[‘migration_enabled’]をTRUEに設定します。
- そして、applicationフォルダの下にmigrationsフォルダを作成します。
- そして、001_create_users.phpを作成し、以下のように定義します。
<?php defined('BASEPATH') OR exit('No direct script access allowed'); class Migration_Create_users CI_Migration { public function up() { $this->dbforge->add_field('id'); $this->dbforge->add_field(array( 'name' => array( 'type' => 'VARCHAR', 'constraint' => '100', ), 'password' => array( 'type' => 'VARCHAR', 'constraint' => '100' ) )); $this->dbforge->create_table('users'); } public function down() { $this->dbforge->drop_table('users'); } }
- 次に、application/config/migration.phpの$config[‘migration_version’]を1にします。
- migrateするには、Migrateライブラリを使う必要があるため、それを呼びます。呼ぶには、コントローラーからアクセスして呼ぶっぽいです。コマンドラインでもできるかもしれないけど、そのやり方は書いてなかったですね。例えば、Migrateコントローラーを作って呼んでみます。
<?php class Migrate extends CI_Controller{ public function index() { $this->load->library('migration'); if (!$this->migration->current()) { show_error($this->migration->error_string()); } } }
- http://localhost/index.php?migrate/indexにアクセスしてみましょう(URLルーティングいじってたら別になりますので注意。まぁ普通はいじってると思いますが)
- エラーになったら、原因を直してリロードしましょう。何も表示されなかったらマイグレーション成功です。phpMyAdminなどで見てみましょう。
一カ所、ハマった点がありまして、それはprimary keyを設定するところでした。
$this->dbforge->add_field(‘id’);
とすると、自動的にそれがプライマリキーになります。
CodeIgniterのサイトのサンプルコードが’blog_id’となっていたので、それを’id’に修正してからmigrateしたら、エラーで怒られてしまいました。先にadd_fieldしておくとよいでしょう。
SQLを書かなくてもデータベースのテーブルを作ることができて、バージョンも管理できるという点が、やっぱり好きですねぇ。