文書の表示以前のリビジョンバックリンク文書の先頭へ この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 ====== oil コマンドによる model と migration 定義の生成 ====== ===== コマンドの実行方法 ===== oil コマンドは /fuelapp 直下に存在する。\\ <code> $ cd fuelapp $ oil generate model tablename column1:varchar[10] column2:int column3:datetime column4:text </code> または cli 版の php を明示して実行 <code> $ php oil generate model ... </code> generate は g のように短縮指定で実行 <code> $ oil g model ... </code> ===== model 生成の実行 ===== oil の g model に table に関する情報を指定する。 <code> $ oil g model [テーブル名] [列1:列1の型] [列2:列2の型] [列3:列3の型] ... </code> \\ model の generate を実行すると model コードと migration 定義が生成される。 <code> $ 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 </code> \\ fuelapp/fuel/app/classes/model/tablename.php <code 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, ), ); } </code> fuelapp/fuel/app/migrations/001_create_tablenames.php <code 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'); } } </code> ===== スキーマの生成 ===== <code> $ oil r migrate </code>または<code> $ oil refine migrate </code><code> Performed migrations for app:default: 001_create_tablenames.php </code> 処理済みの migration は以下のように記録される。\\ fuelapp/fuel/app/config/development/migrations.php <code php collapse:true> <?php return array( 'version' => array( 'app' => array( 'default' => array( 0 => '001_create_tablenames', ), ), 'module' => array( ), 'package' => array( ), ), 'folder' => 'migrations/', 'table' => 'migration', ); </code> mysql の migration テーブルにも記録される。<code> 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) </code> ===== create_at、update_at を timestamp 型にする方法 ===== create_at、update_at を timestamp 型にするには --mysql-timestamp を指定する。 <code> $ oil g model tablename column1:varchar[10] column2:int column3:datetime column4:text --mysql-timestamp </code> fuelapp/fuel/app/classes/model/tablename.php <code 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, ), ); } </code> fuelapp/fuel/app/migrations/001_create_tablenames.php <code 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'); } }</code> ===== 生成済みテーブルを強制上書きする方法 ===== 既に生成済みのテーブルを強制的に上書き生成するには -f または --force を指定する。 <code> $ oil g model tablename column1:varchar[10] column2:int column3:datetime column4:text -f </code> ===== テーブル名を複数形で扱いたくない場合 ===== tablename という model を生成すると以下のようになります。 ^ モデルクラスファイル名(単数形) | fuelapp/fuel/app/classes/model/tablename.php | ^ モデルクラス名(単数形) | Model_Tablename | ^ マイグレーションファイル名(複数形) | fuelapp/fuel/app/migrations/001_create_tablenames.php | ^ マイグレーションクラス名(複数形) | Create_tablenames | ^ 物理テーブル名(複数形) | tablenames | Fuel の ORM は、特に指定がないとテーブル名を複数形で扱うので、もともと存在しているテーブルを扱う場合や設計の都合で複数形にできない場合は、手修正する必要がある。 - マイグレーションファイル名を修正する。<code> 001_create_tablenames.php -> 001_create_tablename.php </code> - マイグレーションクラス、物理テーブル名を修正する。\\ fuelapp/fuel/app/migrations/001_create_tablename.php\\ <code php collapse:true highlight:[5,9]> <?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'); } } </code> - モデルクラスに以下を記述する。\\ fuelapp/fuel/app/classes/model/tablename.php\\ <code php collapse:true highlight:[5]> <?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, ), ); } </code> ※Fuel は Inflector::pluralize()、Inflector::singularize() で単数/複数形の単語を生成している。 ===== テーブル名に'_'(アンダースコア) を多用しなければならない場合 ===== 例えば t_table_name のようなテーブル名を使うと、'_' を使った分だけ model の階層が深くなってします。 <code> $ 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 </code> このような階層になってしまうとメンテナンス性もあまりよろしくない。 <code> [fuelapp/fuel/app/classes/model/] +- [t] +- [table] +- name.php </code> このようにしたくても、そのままでは php ファイルをオートロードできない。 <code> [fuelapp/fuel/app/classes/model/] +- t_table_name.php </code> オートロードできるようにするには、以下のファイルを記述する。\\ fuelapp/app/bootstrap.php <code php collapse:true highlight:[14]> <?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'); </code> ===== Observer を無効化したい場合 ===== $_observers をクリアする関数を定義してそれを呼び出す。 <code php collapse:true highlight:[26,27,28,29]> <?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(); } } </code> php/fuelphp/oil_generate_model.txt 最終更新: 2024/03/27 10:51by ともやん