ORM Eloquentに追加された新機能
Laravel4の正式リリースまであと1ヶ月ちょっとらしい。現在はBeta5の開発段階。
フレームワークとしての仕様もほぼ固まってきて、おそらく、大幅な変更点は無いだろうということでEloquentの新しい機能を紹介します。
- コレクション
<?php // 全ての商品一覧を取得 $itemList=Item::all(); // 最初の商品名と最後の商品名を表示 echo $item->first()->item_name; echo $item->last()->item_name; // もちろん普通にforeachで回せる foreach($itemList as $value){ echo $value->item_name; } // 普通の配列のようにアクセスできたり echo $itemList[2]->item_name; // 要素数を取ってきたりも echo $itemList->count(); // コレクションの中に任意のIDが存在するかチェックできたりもする if($itemList->contains($key)){ echo "あるよ"; } // JSONに変換したり $json=$itemList->toJson(); // ただの配列に変換したり $array=$itemList->toArray();
- 時にはコレクションのデータを操作したい事もあるでしょう。そこで、eachとfilterのメソッド。
- 要素に対して、コールバック関数を適応できる。
- eachは単純なループ。全ての要素に対して平等に行われます。filterは該当しない要素を削除してくれます。
- filterは内部でarray_filterをしている事になるので、必ずbool値を返さなければならない。
- falseを返した場合は、コレクションから削除されます。また、bool値を返さなくても、同じ扱いです。
<?php // 全ての商品一覧を取得 $itemList=Item::all(); // 全ての商品名にビックリマークを付与 $itemList->each(function($item){ $item->item_name=$item->item_name."!"; }); // コレクションの中で1000円未満の商品を削除 $itemList->filter(function($item){ if($item->price < 1000){ return false; } return true; }); // 表示 foreach($itemList as $value){ echo $value->item_name.":"; echo $value->price."<br />"; }
と、このように、DBから取ってきた後の一手間として、eachとfilterが使えるようになりました。
個人的には、やや使い所は難しい気もしますが、Laravel3ではなかった機能なので、何らかの形で使ってみたい。
- クエリースコープ
- Ruby on RailsのモデルにあるScopeがLaravel4にも実装されました。
- scopeMethodName($query)という形式でメソッドを作成すれば、よく使う、条件式を予め登録できる機能。
- 以下のサンプルでは、商品テーブルに削除フラグ=del_flgと公開フラグ=public_flgのある商品テーブルがあると仮定する。
- 削除フラグは0デフォルトで1が削除扱い。公開フラグは0が未公開で1が公開の扱い。
- つまり、販売中の商品は削除フラグが0で、公開フラグが1という状態。
- でも、この条件を毎回書くのは面倒。そこでクエリースコープ。
- 以下のサンプルでは、商品テーブルに削除フラグ=del_flgと公開フラグ=public_flgのある商品テーブルがあると仮定する。
-
- モデルファイルの定義
<?php class Item extends Eloquent { protected $table = 'item'; protected $primaryKey = "item_id"; public $timestamps = false; public function scopePublicItem($query){ $query->where('del_flg', '=', 0); $query->where('public_flg', '=', 1); } }
-
- どうやって呼び出すか?
<?php // こう書いていたのが・・・ $itemList=Item::where("del_flg","=",0)->where("public_flg","=",1)->get(); // こんなにシンプルに!呼び出しはscopoを取り除いて、camelCase形式で呼び出す。 $itemList=Item::publicItem()->get(); // 更に条件を追加してもOK $itemList=Item::publicItem()->where("price",">",500)->get(); // こっちでも同じ $itemList=Item::where("price",">",500)->publicItem()->get();
- この、スコープにはwhere句だけでなく、Laravelのクエリービルダーで使えるメソッドが使える。
- よって、whereBetweenもOKだし、orderByでソートも可能。よく使うクエリー条件はスコープメソッドで定義しておくと、グンと効率が上がります。
という事で、今日はこのくらいで...
公式のマニュアルが現在、大幅に追記されていますので、そちらも参照して下さい。