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 <sxh 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,
      ),
  );

} </sxh> fuelapp/fuel/app/migrations/001_create_tablenames.php <sxh 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');
  }

} </sxh>

$ oil r migrate

または

$ oil refine migrate
Performed migrations for app:default:
001_create_tablenames.php

処理済みの migration は以下のように記録される。
fuelapp/fuel/app/config/development/migrations.php <sxh php collapse:true> <?php return array(

'version' => 
array(
	'app' => 
	array(
		'default' => 
		array(
			0 => '001_create_tablenames',
		),
	),
	'module' => 
	array(
	),
	'package' => 
	array(
	),
),
'folder' => 'migrations/',
'table' => 'migration',

); </sxh> 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 <sxh 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,
      ),
  );

} </sxh> fuelapp/fuel/app/migrations/001_create_tablenames.php <sxh 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');
  }

}</sxh>

既に生成済みのテーブルを強制的に上書き生成するには -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
    <sxh 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');
  }

} </sxh>

  1. モデルクラスに以下を記述する。
    fuelapp/fuel/app/classes/model/tablename.php
    <sxh 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,
      ),
  );

} </sxh> ※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 <sxh 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'); </sxh>

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

} </sxh>

  • php/fuelphp/oil_generate_model.1566165867.txt.gz
  • 最終更新: 2019/08/19 07:04
  • by ともやん