@Rukis

Есть ли аналог Eloquetn scopes для Doctrine ORM?

В Eloquetn ORM есть замечательный функционал scopes https://laravel.com/docs/5.7/eloquent#query-scopes

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

Например, есть у нас несколько разных запросов для получения списка постов но в каждом из этих запросов необходимо ограничить выборку по ряду критериев одинаковых для всех запросов. Скажем, мы принимаем решение отображать или нет пост исходя из нескольких параметров: роль пользователя, автор ли он, в каком статусе пост, когда он был опубликован.

Работая с eloquetn мы просто создадим метод, например scopeVisable() в моделе Post:
public function scopeVisable($query, User $user)
{
     ...
     return $query->where(...);
}

а затем при формировании любого запроса на получение постов сможем использовать эту заготовку при построении запроса: $posts = Post::visable($user)->get();

Как принято решать такие задачи с доктриной?
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 1
@sidni
Php Developer
Ну в принципе можно такое реализовать единственно, что в Доктрине принят паттерн Репозиторий, и все построения запросов происходят в рамках этого репозитория ну если примитивно можно сделать так
//class BlogPostRepository
 
    private function active(QueryBuilder $qb)
    {
        return $qb->andWhere($this->alias.'.status = :activeStatus')
                    ->setParameter('activeStatus', BlogPost::STATUS_ACTIVE);
    }

public function findByUser(User $user)
    {
        $qb =  $this->createQueryBuilder($this->alias);
        $this->active($qb);
        return $qb->andWhere($this->alias.'.user = :user')
               ->setParameter('user', $user)
               ->getQuery()
               ->getResult();
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Айтигро Екатеринбург
До 80 000 руб.
Amigoweb Магнитогорск
от 50 000 до 70 000 руб.
21 апр. 2019, в 19:08
75000 руб./за проект
21 апр. 2019, в 18:14
500 руб./за проект
21 апр. 2019, в 15:25
50000 руб./за проект