====== 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 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 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 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 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 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\\ 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\\ 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 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 をクリアする関数を定義してそれを呼び出す。 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(); } }