Как проверить, является ли Entity одним из отношений ManyToMany с Doctrine QueryBuilder

У меня есть профиль и сущность пользователя. Профили могут быть связаны с пользователями одним из трех способов:

  • основной пользователь
  • editПользователи
  • просмотрПользователи

Это базовая структура разрешений. Что мне нужно сделать, так это получить все профили пользователя, независимо от предоставленных разрешений. Я думаю, что если бы я использовал Doctrine 2.5.*, все было бы в порядке, так как в QueryBuilder добавлено сравнение «member of», но я использую Symfony 2.7.* и, к сожалению, Doctrine поднимается только до 2.4.* (какая-то стабильность проблема возникает, если вы перейдете на Doctrine 2.5 с меньшим количеством Symfony 3).

Я не уверен, как воспроизвести функциональность, хотя.

<?php
namespace AppBundle\Entity;

use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\EntityRepository;

class ProfileRepository extends EntityRepository
{
    /**
     * @param User $user
     *
     * @return ArrayCollection
     */
    public function getAllByUser(User $user, $status = NULL)
    {
        $qb = $this->createQueryBuilder('p');
        $e  = $qb->expr();

        $qb->where($e->eq('p.primary_user', ':user'));
        // Some kind of comparison? a join?;
        $qb->setParameter('user', $user);
        $qb->setParameter('userId', $user->getId());

        if ($status) {
            $qb->andWhere($e->eq('p.status', ':status'));
            $qb->setParameter('status', $status);
        }

        return $qb->getQuery()->getResult();
    }
}

person TheGremlyn    schedule 15.12.2015    source источник


Ответы (1)


Решения...

Использование DQL:

SELECT p 
  FROM Profile p 
 WHERE p.primaryUser = :user 
    OR :user MEMBER OF p.editUsers 
    OR :user MEMBER OF p.viewUsers

Использование QueryBuilder:

$qb = $this->createQueryBuilder("p");

$qb
    ->where("p.primaryUser = :user")
    ->orWhere(":user MEMBER OF p.editUsers")
    ->orWhere(":user MEMBER OF p.viewUsers")
    ->setParameter("user", $user)
;
person Guilherme Blanco    schedule 15.12.2015
comment
Спасибо! Я не знал, что MEMBER OF и помощник isMemberOf были добавлены в Doctrine в разное время. - person TheGremlyn; 15.12.2015