Я пытаюсь реализовать «одобренное» состояние для таблицы, которую я имею, это довольно просто, в основном, если столбец одобрения строки равен 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)
)