@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();

Как принято решать такие задачи с доктриной?
  • Вопрос задан
  • 620 просмотров
Пригласить эксперта
Ответы на вопрос 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();
    }
Ответ написан
Ваш ответ на вопрос

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

Похожие вопросы