15

私が持っているテーブルに「承認済み」状態を実装しようとしています。基本的には、行の承認列が 1 の場合、その行を取得する必要があり、それ以外の場合は取得しないでください。

問題は、コードベース全体を調べて WHERE ステートメント (つまり、関数呼び出し) を追加する必要があることです。これは時間がかかるだけでなく、非効率的でもあります (その機能を削除したい場合など)。

どうやってやるの?$this->where(..)Eloquent 子クラスのコンストラクター内に追加するのと同じくらい簡単ですか? それは他の CRUD 操作に影響しませんか? 未承認の行を更新しないなど?

4

3 に答える 3

21

利用可能なクエリスコープ機能がなかったときに答えが与えられました。

Post次のように、モデルに対してのみメインクエリをオーバーライドできます

class Post extends Eloquent
{
    protected static $_allowUnapprovedPosts = false;

    public function newQuery()
    {
        $query = parent::newQuery();

        if (!static::$_allowUnapprovedPosts) {
            $query->where('approved', '=', 1);
        } else {
            static::$_allowUnapprovedPosts = false;
        }

        return $query;
    }

    // call this if you need unapproved posts as well
    public static function allowUnapprovedPosts()
    {
        static::$_allowUnapprovedPosts = true;

        return new static;
    }
}

ここで、単純に何でも使用しますが、承認されていないユーザーは結果に表示されません。

$approvedPosts = Post::where('title',  'like', '%Hello%');

ここで、承認されていないものも含めてすべての投稿を取得する必要がある場合は、次を使用できます

$approvedPosts = Post::allowUnapprovedPosts()->where('title',  'like', '%Hello%');

更新 (クエリ スコープを使用):

Laravel はGlobal Query Scopesを提供するようになったため、このハッキーなソリューションの代わりにそれを活用し、この回答の日付に注意してください。古すぎて、今では多くのことが変更されています。

// Using a local query scope
class Post extends Eloquent
{

    public function scopeApproved($query)
    {
        return $query->where('approved', 1);
    }
}

次のように使用できます。

$approvedPosts = Post::approved()->get();
于 2013-09-08T05:45:34.330 に答える