2016-08-31 2 views
0

У меня есть объекты: Tag, User и Service. Tag имеет отношения «многие ко многим» с User и Service.Doctrine Mysql: несколько соединений в построителе запросов

class Service{ 
     /** 
     * @ORM\ManyToMany(targetEntity="Tag", mappedBy="serviceList") 
     */ 
     private $tagList; 
} 

class User{ 
     /** 
     * @ORM\ManyToMany(targetEntity="Tag", mappedBy="userList") 
     */ 
     private $tagList; 
} 

class Tag{ 
     /** 
     * @ORM\ManyToMany(targetEntity="User", inversedBy="tagList") 
     * @ORM\JoinTable(name="tags_users") 
     */ 
     private $userList; 

     /** 
     * @ORM\ManyToMany(targetEntity="Service", inversedBy="tagList") 
     * @ORM\JoinTable(name="tags_services") 
     */ 
     private $serviceList; 
} 

С построитель запросов, как я могу вернуть все услуги, которые имеют по крайней мере 1 общего тег с заданными User, то есть услуг, связанных с пользователем

Это запрос, я написал, но это не работа

$query = $em->getRepository('AppBundle:Service') 
     ->createQueryBuilder('service') 
     ->join('service.tagList', 'serviceTag') 
     ->join('AppBundle:BasicUser', 'user') 
     ->join('user.tagList', 'userTag') 
     ->where('user.id = :id') 
     ->andWhere('serviceTag.id = userTag.id') 
     ->setParameter('id', $user->getId()) 
    ; 

Ошибка:

[Syntax Error] line 0, col 104: Error: Expected Literal, got "JOIN" (500 Internal Server Error) 

ответ

3

You r неверен. Я думаю, что самым простым решением было бы следующее:

$query = $em->getRepository('AppBundle:Service') 
      ->createQueryBuilder('service') 
      ->innerJoin('service.tagList', 'tag') 
      ->andWhere(':user MEMBER OF tag.userList') 
      ->setParameter('user',$user) 
      ; 
+0

хорошее решение, некоторое объяснение abot the innerJoin tag plz – ahmedbhs

Смежные вопросы