У меня есть 2 объекта: пользователь и архив. Пользовательский объект имеет, помимо прочего, два свойства:
/** * @ORM\OneToMany(targetEntity="My\ApplicationBundle\Entity\Archive", mappedBy="user") **/ protected $archives; /** * @ORM\ManyToMany(targetEntity="My\ApplicationBundle\Entity\Archive", inversedBy="users") * @ORM\JoinTable(name="collection") **/ private $collection;
и объект Archive:
/** * @ORM\ManyToOne(targetEntity="My\UserBundle\Entity\User", inversedBy="archives") * @ORM\JoinColumn(name="user_id", referencedColumnName="id") **/ protected $user; /** * @ORM\ManyToMany(targetEntity="My\UserBundle\Entity\User", mappedBy="collection") **/ private $users;
причина этого небольшого беспорядка довольно проста: в User, $ archives представлены все архивы, представленные пользователем, $ collection представляет все архивы, используемые пользователем (даже представленные другими пользователями). В объекте Archive, $ user представляет пользователя, представившего этот архив, $ users представляют всех пользователей, использующих этот архив.
Итак, чтобы получить архивы одного пользователя, я просто использую:
$this->getUser()->getArchives();
и получить коллекцию:
$this->getUser()->getCollection();
проблема в том, что мне приходится разбивать страницы на результаты, поэтому мне нужно использовать построитель запросов. что я делаю:
$repository = $this->getDoctrine() ->getRepository('MyApplicationBundle:Archive'); $query = $repository->createQueryBuilder('a') ->innerJoin('a.user', 'u', 'WITH', 'u = :user') ->where('a.active = :active') ->setParameters(array( 'user' => $this->getUser(), 'active' => 1 )) ->setFirstResult($start) ->setMaxResults($length) ->getQuery() ->getResult();
но здесь проблема заключается в том, что я перехожу непосредственно в архив без использования таблицы сбора (для этого нет сущности). Может кто-нибудь, пожалуйста, объясните мне, как горячо рассматривать таблицу сбора, чтобы отфильтровать мои результаты?
Большое спасибо Мануэль
благодаря LPodolski, вот как я изменил DQB
$query = $repository->createQueryBuilder('a') //->innerJoin('a.user', 'u', 'WITH', 'u = :user') ->innerJoin('a.users', 'cu', 'WITH', 'cu = :user') ->where('a.active = :active') ->setParameters(array( 'user' => $this->getUser(), 'active' => 1 )) ->setFirstResult($start) ->setMaxResults($length) ->getQuery() ;