tetu式

ゲームと音楽・作曲の自己満足と悩みどころの多いプログラムのブログ。

fuelPHP orm機能使ってみる

前回に続いてfuelPHP
内容的にも前回の続きみたいな感じです。


前回はマイグレーションでDBのバージョン管理の説明をしました。
今回は実際にDBにデータを入れる方法をば。




前回のマイグレーションは model という文を使ってマイグレーションファイルだけでなく、モデルも一緒に生成するようにしてました。

まずは前回作ってみたmodelフォルダにあるtest.phpの中身。

<?php

class Model_Create_Test extends \Orm\Model
{
	protected static $_properties = array(
		'id',
		'name',
		'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_update'),
			'mysql_timestamp' => false,
		),
	);
	protected static $_table_name = 'create_tests';

}

いつもはモデルになるクラスは Model を継承(extends)するのですが、マイグレーションで作ったこのモデルは \Orm\Model を継承しています。

ormというのはオブジェクト関係マッピング(Object-relational mapping)のことです。

なんのこっちゃ、自分もよくわからないです。
感覚的にはSQLを扱う内容をオブジェクト化し、中身の値を書き換えたりして保存。保存内容がSQLとして実行される。こんな感じ。

にweb勤怠管理のあたりで行っていたクエリビルダすら使わずに簡単なDB操作ができる感じですね。

あの時はちまちまDBを操作していたので簡単なものでも作るのに時間かかりそうなプログラムになっていました。


さて、本題。使い方。

基本的な書き方はこんな感じ。

<?php
class Model_MySQLWorks extends \Model
{
	/**
	 *
	 * create_testsテーブルにidとnameを登録
	 */
	public static function Insert_Create_Test()
	{
		$ret = false;
		//データの整理
		$data=array(
		'id'=>Input::post('id'),
		'name'=>Input::post('name'),
		);
		//モデルのインスタンス化
		$new=Model_Create_Test::forge($data);
		//データの保存
		if($new->save())
		{
			$ret = true;
		}
		return $ret;
	}
}

マイグレーションで作成したtest.phpとは別に普通の model を継承したクラス(Model_MySQLWorks)を一個作ってその中に入れときます。
$dataにSQLカラム名と入れたい値を連想配列で入れ、マイグレーションで作ったモデルをインスタンス化しつつ配列をねじ込ませ、後は保存。
これでSQL文で言うなら

insert into create_tests
(id, name)
values
(post('id')の値, post('name')の値);

この処理をしたのと同じになります。
ifの中にある$new->save()は上のSQLの成否を返してくれます。

実際にControllerから呼び出す時は

<?php
	$validation = Validation::forge();
	//バリデーション設定。とりあえず入力してるかどうか。
	$validation->add('id' , 'id')
				->add_rule('required');
	$validation->add('name' , 'name')
				->add_rule('required');
	if($validation->run())
	{
		$ret =  Response::forge(Model_MySQLWorks::Insert_Create_Test());
		if($ret == true)
		{
			echo("insert create_test");
		}
		else
		{
			echo("SQL error");
		}
	}
	else
	{
		echo("validation error");
	}

こんな感じで。

利点としてはコード中にSQL文を直接書かないこと。
今回はinsertのみですが、updateやdeleteなんかもやってくれます。
この二つはwhereも絡んでくるので多少面倒ですが・・・
あとテーブル名やカラム名を忘れてしまい、わざわざDBにアクセスして確認に行かなくてもソースコードだけで確認できるのが地味に良いです。
セキュリティもfuelPHPが保証してくれてるみたいです。