5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

FuelPHPのOrmで名前付きスコープを実装する

Posted at

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にもそのまま適用できた。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?