php:fuelphp:oil_generate_model

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 ...

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 型にするには –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 は、特に指定がないとテーブル名を複数形で扱うので、もともと存在しているテーブルを扱う場合や設計の都合で複数形にできない場合は、手修正する必要がある。

  1. マイグレーションファイル名を修正する。
    001_create_tablenames.php -> 001_create_tablename.php
  2. マイグレーションクラス、物理テーブル名を修正する。
    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');
        }
    }
  3. モデルクラスに以下を記述する。
    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');

$_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();
    }
}
  • php/fuelphp/oil_generate_model.txt
  • 最終更新: 2024/03/27 10:51
  • by ともやん