ECサイト運営開発記

PHPフレームワーク Laravelの使い方を中心とした通販サイトの開発日記

ORM Eloquentに追加された新機能

Laravel4の正式リリースまであと1ヶ月ちょっとらしい。現在はBeta5の開発段階。
フレームワークとしての仕様もほぼ固まってきて、おそらく、大幅な変更点は無いだろうということでEloquentの新しい機能を紹介します。

  • コレクション
    • Laravel4のEloquentでは、DBからの取得結果をコレクションにして返却してくれるようになりました。
      • Eloquentのコレクションはイテレーターやら配列アクセスやらJSON変換やらいろんなインターフェースを実装してる。
<?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という状態。
        • でも、この条件を毎回書くのは面倒。そこでクエリースコープ。
    • モデルファイルの定義
<?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でソートも可能。よく使うクエリー条件はスコープメソッドで定義しておくと、グンと効率が上がります。

という事で、今日はこのくらいで...
公式のマニュアルが現在、大幅に追記されていますので、そちらも参照して下さい。