November 27, 2011

oil generate scaffoldでOrm\Modelを継承したModelを生成

先日、以下の記事を書きました。
http://madroom-project.blogspot.com/2011/11/windows-xamppfuelphp.html

この時、postsテーブルにはcreated_atというカラムと
updated_atというカラムが作成されました。
これらのカラムは、oil generate scaffoldで作成されたmigrationファイルに、
デフォルトで含まれています。

カラム名から察するに、insert時やupdate時に、自動でタイムスタンプがsetされるのだろう。
と思っていましたが、どうも、0という値が入り、タイムスタンプが入りません。

原因は、生成されたModelが、Model_Crudを継承していて、
Orm\Modelを継承していないからでした。

Orm\Modelを継承したModelを作成するには、
"--orm"を付与してoil generate scaffoldを実行する必要があります。
尚、"generate"は"g"と略せます。具体的には、以下のようなコマンドになります。
$ php oil g scaffold post title:string summary:varchar[250] body:text --orm

これで、Orm\Modelを継承したModelが作成されました。
namespace Model;

class Post extends \Orm\Model
{
 
    protected static $_observers = array(
        'Orm\Observer_CreatedAt' => array('before_insert'),
        'Orm\Observer_UpdatedAt' => array('before_save'),
    );
}

また、app/config.phpのalways_loadのpackagesで、ormを有効にする必要があります。
'always_load'  => array(

    /**
     * These packages are loaded on Fuel's startup.  You can specify them in
     * the following manner:
     *
     * array('auth'); // This will assume the packages are in PKGPATH
     *
     * // Use this format to specify the path to the package explicitly
     * array(
     *     array('auth'    => PKGPATH.'auth/')
     * );
     */
    'packages'  => array(
        'orm',
    ),

これでOKと思いきや、postsコントローラにアクセスすると、以下のエラーが発生。
--
Fuel\Core\Database_Exception [ 1054 ]: Unknown column 't0.' in 'where clause' [ SELECT `t0`.`id` AS `t0_c0`, `t0`.`title` AS `t0_c1`, `t0`.`summary` AS `t0_c2`, `t0`.`body` AS `t0_c3`, `t0`.`created_at` AS `t0_c4`, `t0`.`updated_at` AS `t0_c5` FROM `posts` AS `t0` WHERE `t0`.`id` = '0' OR ((`t0`.`` IS null)) LIMIT 1 ]
--

このエラーは、自動生成されたコントローラの
$data['posts'] = Post::find_all();

$data['posts'] = Post::find('all');
にすることで解決出来ました。

これでinsertやupdateをしてやると、無事、created_atやupdated_atに
UNIXタイムスタンプが入るようになりました。


参考:
http://docs.fuelphp.com/packages/oil/generate.html

No comments:

Post a Comment