2016-08-31 4 views
0

Ich habe Entitäten: Tag, User und Service. Tag hat viele-zu-viele-Beziehung mit sowohl User und Service.Doctrine Mysql: mehrere Joins in Abfrage-Generator

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; 
} 

Mit Query Builder wie kann ich alle Dienste zurück, die den Benutzer im Zusammenhang mindestens 1 gemeinsamen Tag mit bestimmten User, dh Dienstleistungen hat

Dies ist eine Abfrage, die ich geschrieben habe, aber es ist nicht der Fall ist

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

Fehler arbeiten:

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

Antwort

3

Sie r Abfrage ist falsch. Ich denke, die einfachste Lösung wäre:

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

gute lösung, einige explinatio about the innerJoin tag plz – ahmedbhs