Laravel 4:Как применить условие WHERE ко всем запросам класса Eloquent?

Я пытаюсь реализовать "одобренное" состояние для таблицы, которая у меня есть, это довольно просто, в основном, если столбец утверждения строки равен 1; эта строка должна быть извлечена, иначе она не должна.

проблема в том, что теперь я должен пройти через всю кодовую базу и добавить оператор WHERE(т. е. вызов функции), который не только занимает много времени, но и неэффективен(если я когда-либо захочу удалить эту функцию и т. д.)

Как я могу это сделать? Это так же просто, как добавление $this->where(..) внутри конструктора красноречивого дочернего класса? Разве это не повлияет на другие операции CRUD? например, не обновлять неутвержденную строку?

3 ответов


вы можете изменить основной запрос, только для 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 теперь предоставляет Глобальные Области Запросов, используйте это вместо этого хакерского решения, обратите внимание на дату этого ответа, он слишком стар и столько всего изменилось.


самое близкое, что я нашел красноречивая область запроса.

хотя это требует незначительного изменения в моем коде (префиксные запросы), это все еще дает мне то, что я смотрю с большой гибкостью.

вот пример:

создайте функцию в классе Eloquent child:

class Post extends Eloquent {

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

}

тогда просто используйте его так:

$approvedPosts = Post::approved()-><whatever_queries_you_have_here>;

отлично работает. Нет уродливых повторяющихся вызовов функции WHERE. легко изменить. Много легче читать(approved() делает гораздо больше смысла, чем where('approved', '=', 1) )


можно использовать глобальный масштаб для вашей потребности, документы для этого здесь:https://laravel.com/docs/5.6/eloquent#query-scopes

пример SoftDeletingScope который применяется ко всем запросам по умолчанию для моделей, которые используют SoftDeletes черта.