目次
oil コマンドによる model と migration 定義の生成
コマンドの実行方法
oil コマンドは /fuelapp 直下に存在する。
$ cd fuelapp $ oil generate model tablename column1:varchar[10] column2:int column3:datetime column4:text
または cli 版の php を明示して実行
$ php oil generate model ...
generate は g のように短縮指定で実行
$ oil g model ...
model 生成の実行
oil の g model に table に関する情報を指定する。
$ oil g model [テーブル名] [列1:列1の型] [列2:列2の型] [列3:列3の型] ...
model の generate を実行すると model コードと migration 定義が生成される。
$ oil g model tablename column1:varchar[10] column2:int column3:datetime column4:text Creating model: /Users/tomoyan/fuelapp/fuel/app/classes/model/tablename.php Creating migration: /Users/tomoyan/fuelapp/fuel/app/migrations/001_create_tablenames.php
fuelapp/fuel/app/classes/model/tablename.php
- collapse:true
<?php class Model_Tablename extends \Orm\Model { protected static $_properties = array( 'id', 'column1', 'column2', 'column3', 'column4', 'created_at', 'updated_at' ); protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => false, ), 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => false, ), ); }
fuelapp/fuel/app/migrations/001_create_tablenames.php
- collapse:true
<?php namespace Fuel\Migrations; class Create_tablenames { public function up() { \DBUtil::create_table('tablenames', array( 'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true), 'column1' => array('constraint' => 10, 'type' => 'varchar'), 'column2' => array('constraint' => 11, 'type' => 'int'), 'column3' => array('type' => 'datetime'), 'column4' => array('type' => 'text'), 'created_at' => array('constraint' => 11, 'type' => 'int'), 'updated_at' => array('constraint' => 11, 'type' => 'int'), ), array('id')); } public function down() { \DBUtil::drop_table('tablenames'); } }
スキーマの生成
$ oil r migrate
または
$ oil refine migrate
Performed migrations for app:default: 001_create_tablenames.php
処理済みの migration は以下のように記録される。
fuelapp/fuel/app/config/development/migrations.php
- collapse:true
<?php return array( 'version' => array( 'app' => array( 'default' => array( 0 => '001_create_tablenames', ), ), 'module' => array( ), 'package' => array( ), ), 'folder' => 'migrations/', 'table' => 'migration', );
mysql の migration テーブルにも記録される。
mysql> use fuel_db; Database changed mysql> SELECT * FROM migration; +------+---------+--------------------------+ | type | name | migration | +------+---------+--------------------------+ | app | default | 001_create_tablenames | +------+---------+--------------------------+ 1 row in set (0.00 sec)
create_at、update_at を timestamp 型にする方法
create_at、update_at を timestamp 型にするには –mysql-timestamp を指定する。
$ oil g model tablename column1:varchar[10] column2:int column3:datetime column4:text --mysql-timestamp
fuelapp/fuel/app/classes/model/tablename.php
- collapse:true
<?php class Model_Tablename extends \Orm\Model { protected static $_properties = array( 'id', 'column1', 'column2', 'column3', 'column4', 'created_at', 'updated_at' ); protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => true, ), 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => true, ), ); }
fuelapp/fuel/app/migrations/001_create_tablenames.php
- collapse:true
<?php namespace Fuel\Migrations; class Create_tablenames { public function up() { \DBUtil::create_table('tablenames', array( 'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true), 'column1' => array('constraint' => 10, 'type' => 'varchar'), 'column2' => array('constraint' => 11, 'type' => 'int'), 'column3' => array('type' => 'datetime'), 'column4' => array('type' => 'text'), 'created_at' => array('type' => 'timestamp'), 'updated_at' => array('type' => 'timestamp'), ), array('id')); } public function down() { \DBUtil::drop_table('tablenames'); } }
生成済みテーブルを強制上書きする方法
既に生成済みのテーブルを強制的に上書き生成するには -f または –force を指定する。
$ oil g model tablename column1:varchar[10] column2:int column3:datetime column4:text -f
テーブル名を複数形で扱いたくない場合
tablename という model を生成すると以下のようになります。
モデルクラスファイル名(単数形) | fuelapp/fuel/app/classes/model/tablename.php |
---|---|
モデルクラス名(単数形) | Model_Tablename |
マイグレーションファイル名(複数形) | fuelapp/fuel/app/migrations/001_create_tablenames.php |
マイグレーションクラス名(複数形) | Create_tablenames |
物理テーブル名(複数形) | tablenames |
Fuel の ORM は、特に指定がないとテーブル名を複数形で扱うので、もともと存在しているテーブルを扱う場合や設計の都合で複数形にできない場合は、手修正する必要がある。
- マイグレーションファイル名を修正する。
001_create_tablenames.php -> 001_create_tablename.php
- マイグレーションクラス、物理テーブル名を修正する。
fuelapp/fuel/app/migrations/001_create_tablename.php
- collapse:true highlight:
<?php namespace Fuel\Migrations; class Create_tablename { public function up() { \DBUtil::create_table('tablename', array( 'id' => array('constraint' => 11, 'type' => 'int', 'auto_increment' => true), 'column1' => array('constraint' => 10, 'type' => 'varchar'), 'column2' => array('constraint' => 11, 'type' => 'int'), 'column3' => array('type' => 'datetime'), 'column4' => array('type' => 'text'), 'created_at' => array('type' => 'timestamp'), 'updated_at' => array('type' => 'timestamp'), ), array('id')); } public function down() { \DBUtil::drop_table('tablenames'); } }
- モデルクラスに以下を記述する。
fuelapp/fuel/app/classes/model/tablename.php
- collapse:true highlight:
<?php class Model_Tablename extends \Orm\Model { public static $_table_name = "tablename"; protected static $_properties = array( 'id', 'column1', 'column2', 'column3', 'column4', 'created_at', 'updated_at' ); protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => true, ), 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => true, ), ); }
※Fuel は Inflector::pluralize()、Inflector::singularize() で単数/複数形の単語を生成している。
テーブル名に'_'(アンダースコア) を多用しなければならない場合
例えば t_table_name のようなテーブル名を使うと、'_' を使った分だけ model の階層が深くなってします。
$ oil generate model t_table_name column1:varchar[10] column2:int column3:datetime column4:text --mysql-timestamp Creating model: /Users/tomoyan/fuelapp/fuel/app/classes/model/t/table/name.php Creating migration: /Users/tomoyan/fuelapp/fuel/app/migrations/002_create_t_table_names.php
このような階層になってしまうとメンテナンス性もあまりよろしくない。
[fuelapp/fuel/app/classes/model/] +- [t] +- [table] +- name.php
このようにしたくても、そのままでは php ファイルをオートロードできない。
[fuelapp/fuel/app/classes/model/] +- t_table_name.php
オートロードできるようにするには、以下のファイルを記述する。
fuelapp/app/bootstrap.php
- collapse:true highlight:
<?php // Load in the Autoloader require COREPATH.'classes'.DIRECTORY_SEPARATOR.'autoloader.php'; class_alias('Fuel\\Core\\Autoloader', 'Autoloader'); // Bootstrap the framework DO NOT edit this require COREPATH.'bootstrap.php'; Autoloader::add_classes(array( // Add classes you want to override here // Example: 'View' => APPPATH.'classes/view.php', 'Model_T_Table_Name' => APPPATH.'classes/model/t_table_name.php', )); // Register the autoloader Autoloader::register(); /** * Your environment. Can be set to any of the following: * * Fuel::DEVELOPMENT * Fuel::TEST * Fuel::STAGE * Fuel::PRODUCTION */ Fuel::$env = (isset($_SERVER['FUEL_ENV']) ? $_SERVER['FUEL_ENV'] : Fuel::DEVELOPMENT); // Initialize the framework with the config file. Fuel::init('config.php');
Observer を無効化したい場合
$_observers をクリアする関数を定義してそれを呼び出す。
- collapse:true highlight:
<?php class Model_Tablename extends \Orm\Model { protected static $_properties = array( 'id', 'column1', 'column2', 'column3', 'column4', 'created_at', 'updated_at' ); protected static $_observers = array( 'Orm\Observer_CreatedAt' => array( 'events' => array('before_insert'), 'mysql_timestamp' => true, ), 'Orm\Observer_UpdatedAt' => array( 'events' => array('before_save'), 'mysql_timestamp' => true, ), ); public static function clear_observers() { static::$_observers = array(); } }