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 черта.