WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
クエリースコープ

クエリースコープ

このエントリーをはてなブックマークに追加

頻繁に使用するクエリーは、クエリースコープで登録することで、簡単に再利用することができます。クエリースコープは、scope+メソッド名(メソッド名の先頭は大文字)で作成し、Model::メソッド名で使用することができます。

クエリースコープの定義

それでは、早速クエリースコープを定義してみたいと思います。

app/models/User.php

class User extends Eloquent{
 public function scopeYoung($q){
 return $q->where('age','<',20);
 }
 public function scopeMen($q){
 return $q->whereGender('m');
 }
 }
  • 2-4行目:scopeYoungメソッドは、Userモデルの’age’プロパティ(ageフィールド)が、20未満のモデルを抽出します。
  • 5-7行目:scopeMenメソッドは、Userモデルの’gender’プロパティ(genderフィールド)が、mのモデルを抽出します。
  • 6行目は、return $q->where(‘gender’,’m’); と同じです。

クエリースコープの使用

モデルで登録したクエリースコープは、そのモデルのメソッドとして使用することができます。

app/controllers/UserController.php

public function getIndex(){
 $users=User::young()->men()->orderBy('age')->get();
 return View::make('user/index',compact($users));
 }
  • 上記例では、Userモデルの年齢が20未満の男性を若い順に取得(※正確には、usersテーブルのageフィールドの値が20未満で、genderフィールドの値がmのデータをageフィールドの値が小さい順に取得)して、ビューファイルに添付しています。

動的スコープ

クエリースコープの第2引数以降に、パラメーターを指定することで、パラメーターを指定したメソッドを作成することもできます。

私がいつも使っている複合語の曖昧検索のためのクエリースコープを下記にご紹介します。

app/models/User.php

class User extends Eloquent{
 public function scopeLike($query,$name,$search){
 //全角スペースを半角スペースに変換
 $keyword = mb_convert_kana($search,'s');
 //検索文字を半角スペースで区切って配列に代入
 $keywords=preg_split('/[\s]+/', $keyword,-1,PREG_SPLIT_NO_EMPTY);
 //配列の数だけ繰り返し
 foreach($keywords as $value){
 $query->where($name,'like','%'.$value.'%');
 }
 return $query;
 }
 }
  • 2行目:scopeLikeクエリースコープの第2引数には、プロパティ(カラム)名、第3引数には、入力文字列を指定します。
  • 4行目:第3引数で指定した文字列の全角スペースを半角スペースに変換します(単語間を全角スペースで区切っても半角スペースで区切ってもどちらでもいいように)。
  • 6行目:preg_split関数で、半角スペースごとに単語を区切って配列に代入します。
  • 8-10行目:上記で作成した単語の配列を配列の数だけforeachで曖昧検索を繰り返します。つまり、スペースで区切った全ての単語を含むモデルを抽出します。

上記で作成したscopeLikeクエリースコープは、下記のように使用します。

app/controllers/UserController.php

public function anySearch(){
 if(Input::has('search')){
 Session::put('name',Input::get('search'));
 }
 $data['users']=User::like('name',Session::get('name'))->paginate(10);
 return View::make('/user/search',$data);
  • 1行目:GETでもPOSTでもどちらでも対応できるように、anySearch()を使用しています。
  • 2-4行目:/user/searchビューから、searchフィールドを受け取ったら、セッション’name’にその値を代入します。
  • 5行目:クエリースコープで作成したlikeメソッドは、第2引数に、Userモデルのプロパティ(カラム)名、第2引数に、検索単語の値を代入します。つまり、nameプロパティが、セッション’name’の単語の値を曖昧検索して、条件に合ったモデルを返します。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です