Yiiみたいにこんな書き方をしたい。
公開中の記事の最新5件を取得
$posts = Model_Post::query()->published()->recently(5)->get();
名前付きスコープっていうのは、取得条件に名前をつけて、クエリビルダで指定できるようにすること(多分)。
whereの条件を意味のある固まりで分割できるので、条件の再利用が簡単になる。
Queryを拡張する
メソッドチェーンに利用されるQueryクラスを拡張して、スコープ用メソッドを作成する。
これはモデルごとに用意する。
fuel/app/classes/query/post.php
class Query_Post extends \Orm\Query
{
public function published($status = 1)
{
return $this->where('status', $status);
}
public function recently($limit = 10)
{
return $this
->order_by(array('created_at' => 'DESC'))
->limit($limit);
}
}
Modelを修正する
queryメソッドを上書きして、上で作ったQueryクラスを使うように変更する。
fuel/app/classes/model/post.php
class Model_Post extends Orm\Model
{
/**
* @param array $options
* @return Query_Post
*/
public static function query($options = array())
{
return Query_Post::forge(get_called_class(), array(static::connection(), static::connection(true)), $options);
}
}
これで完成。
最後に
実装はYii 2.0のドキュメントを参考にした。
Yii2でスコープが廃止されたと聞いて、「え、じゃあ、どうしたらいいの?」と思ってドキュメントを見たら、継承を使ったシンプルな実装が紹介されていて、FuelPHPにもそのまま適用できた。