FuelPHPのORM(オブジェクトリレーショナルマッパー)

ORMとは、オブジェクトリレーショナルマッパーの略で、オブジェクトにデータベーステーブルの行をマップし、オブジェクト間の関係を確立するためのアプリケーションです。これにより、データベースから簡単に項目の作成、更新、削除、検索の手続きが出来るようになります。

1. ORMパッケージは、FuelPHPのパッケージに標準で含まれていますので、ORMを使うには、configファイルのパッケージに配列で指定するだけで使用できるようになります。

app/config/config.php

'packages' => array(
 'orm',
 ),

2. ORMを使用するには、 使用するモデルに関連づけをするために、Orm\Modelを拡張する必要があります。つまり、下記のように記述します。

app/classes/model/モデル名.php

//名前空間でエイリアス名を指定
 use Orm\Model
 //モデルの拡張(下記のModelは、Orm\Modelの事です)
 class Model_モデル名 extends Model{

又は、下記のように記述します。

//Orm\Modelを拡張します(直接記述します)。
 class Model_モデル名 extends Orm\Model{

ORMの設定

3. ORMの設定は、使用するテーブル名、プライマリーキー、フィールド名を設定します。但し、FuelPHPの命名規則に則っていれば、テーブル名と、プライマリーキーは設定する必要はありません(例:テーブル名がcollectionsで、プライマリーキーがid、モデル名がCollection、モデルのファイル名がcollection.phpなら、テーブル名と、プライマリーキーは設定する必要はありません。テーブル名とプライマリーキー、フィールド名の設定例を下記に記述します)。

app/classes/model/collection.php

<?php
class Model_Collection extends Orm\Model{
 //使用するフィールド名をセット
 protected static $_properties = array(
 'id',
 'title',
 'created',
 'modified',
 'col_code',
 'save_space',
 'col_assort_id',
 'col_image_id',
 'note',
 );
 //テーブル名がモデル名の複数形なら省略可
 protected static $_table_name = 'collections';
 //プライマリーキーがidなら省略可
 protected static $_primariy = array('id');
}

データの作成(Create)

4. それでは、設定したORMをどのように使用するのかを見てみましょう。

5. まず、データを作成(Create)するには、モデルをインスタンス化する必要があります。モデルのインスタンス化はnewでインスタンス化するか、Model_モデル名::foege()メソッドでインスタンス化します。

設定例(ポスト送信されたデータをCollecitonモデルに保存)

//データの整理
 $data=array(
 $title=>Input::post('title'),
 $created=>date('Y-m-d H:i:s'),
 $conten=>Input::post('content')
 );
 //モデルのインスタンス化
 $new=Model_Collection::forge($data);
 //データの保存
 $new->save()
 //又は、上記の2行のコードは下記の記述でもOK
 //$new=Model_Collection::forge($data)->save();

データの検索(Read)

6. データの検索(Read)を行うには、IDで特定のデータを検索する方法、データの最初のデータ、又は、最後のデータを検索する方法、及び全てのデータを検索する方法の3つがあります。

例1(CollectionテーブルのIDでデータを検索する方法)

//id=2のデータを検索します。
 $data['coll']=Model_Collection::find(2);
//テンプレートファイルにデータを引き渡す
$this->template->content=View::forge('collection/index,$data);

例2(Collectionsテーブルの最初のデータを検索する方法)

//最初のデータを検索
$data['coll']=Model_Colleciton::find('fisrt');
//作成日の一番新しいデータを検索
$data['coll']=Model_Collection::find('last',array('order_by'=>'created'));

例3(Collectionsテーブルの全データを検索)

//全データを検索
$data['coll']=Model_Collection::find('all'); 
//全データから条件の合うデータを検索
$data['coll']=Model_Collection::find('all',array(
'where' => array(
array('id',1),
),
'order_by'=>array('date'=>'desc'),
));

7. FuelPHPのドキュメントには、データの検索方法は記述しているのですが、ビューへ渡したデータの表示方法が記述していません。初心者が一番迷いやすい点ですが、例1、例2のデータの表示方法と例3の表示方法は全く違いますので、注意が必要です。下記にその例を表記しておきます。

app/classes/controller/collection.php

public function action_example(){
 //例1の場合
 $data['example1'] = Model_Collection::find(1);
 //例2の場合
 $data['example2'] = Model_Collection::find('first');
 //例3の場合
 $data['example3'] = Model_Collection::find('all',array(
 'where'=>array(array('id',1))));
 //テンプレートファイルにデータの引き渡し
 $this->template->content = View::forge('collection/example',$data);
 }

app/views/collection/example.php

<h2>例1の表示</h2>
 <p><strong>ID:</strong><?php echo $example1->id; ?></p>
 <p><strong>Title:</strong><?php echo $example1->title; ?></p>
 <h2>例2の表示</h2>
 <p><strong>ID:</strong><?php echo $example2->id; ?></p>
 <p><strong>Title:</strong><?php echo $example2->title; ?></p>
 <h2>例3の表示</h2>
 <?php foreach($example3 as $e3):?>
 <p><strong>ID:</strong><?php echo $e3->id; ?></p>
 <p><strong>Title:</strong><?php echo $e3->title; ?></p>
 <?php endforeach?>
 <h2>例3の記述間違い</h2>
 <p><strong>ID:</strong><?php echo $example3->id; ?></p>
 <p><strong>Title:</strong><?php echo $example3->title; ?></p>

8. ブラウザで確認してみます。例1~例3は全て同じデータを表示していますが、普通の配列(例1、例2)と多次元配列(例3)の違いがありますので、注意が必要です。

9. ちょっとした勘違いで全く先へ進めなくなってしまうことがまれにあります。私が躓いたからといって皆さんが同じ過ちを犯すとは限りませんが、私と同じ過ちを犯す人がいるかもしれませんので、あえて記述しておきたいと思います。

データの更新(Update)

10. データの更新については、基本的にデータの作成とほとんど変わりません。更新(修正)するデータを検索して、保存するだけですので、説明は省略いたします。

//更新するデータを検索
 $update=Model_Collection::find(1);
 $update->title='更新タイトル名';}
 $update->modified=date('Y-m-d H:i:s');
 //データの保存
 $update->save();

データの削除(Delete)

11. データの更新同様、データの削除もほとんど説明が必要ないと思います。只、ほかのページでも述べましたが、データを削除するときは、必ずワンクッションを置くようにプログラムして下さい。

//削除するデータを検索
 $delete=Model_Collection::find(1);
//データの削除
 $delete->delete();

モデル間のリレーションの設定

12. CakePHPでは、アソシエーションという名前で、モデル間のリレーションを処理するシステムがありました。これと同じようにFuelPHPのOrmでも、モデル間のリレーションを処理するために、$_has_many、$_belongs_to、$_has_one、$_many_manyという4つの種類のリレーションが用意されています。

  • $_has_one
    一対一のリレーションです。CakePHPでは、hasOneでした。Aモデルの1つの行にBモデルの行が1つだけ結びつきます。関連づけを示す外部キーはBテーブル内にあります。
  • $_has_many
    一対多のリレーションです。CakePHPでは、hasManyという名称でした。Aモデルのひとつの行にBモデルの行が複数行結びつきます。関連づけを示す外部キーはBテーブル内にあります。
  • $_belongs_to
    $_has_manyと同じく、一対多のリレーションです。CakePHPでは、belongsToという名称でした。関連づけを示す外部キーは、$_has_oneや$_has_manyとは反対で、Aテーブル内にあります。
  • $_many_many
    多対多のリレーションです。 CakePHPでは、hasAndBelongsToMany(HABTM)という名称でした。中間に対応関係のみを表すテーブル(Cテーブル)を用意することで、AテーブルとBテーブルの間の関連づけを行います。

本日は以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ