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

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

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

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

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

Самое близкое, что я обнаружил, – это область запросов.

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

Вот пример:

Создайте функцию в дочернем классе Eloquent:

 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) )