2014-03-26 4 views
5

Dieser Code:DQL - leftJoin() Fehler: Erwartete Literal erwartet, 'JOIN

$builder->select('p') 
    ->from('ProProposalBundle:Proposal', 'p') 
    ->leftJoin('ProProposalBundle:Proposal:Vote', 'v') 
    ->leftJoin('ProUserBundle:User', 'u') 
    ->andWhere('v.proposal = p') 
    ->andWhere('v.user = u') 
    ->andWhere('v.decision = "in_favor" OR v.decision = "against"') 
    ->andWhere('u = :user') 
    ->setParameter('user', $options['user']) 
    ->andWhere('p.community = :community') 
    ->setParameter('community', $community) 
    ->andWhere('p.archived = :archived') 
    ->setParameter('archived', $options['archived']) 
    ->leftJoin('p.convocation', 'c') 
    ->andWhere("p.convocation IS NULL OR c.status = '" . Convocation::STATUS_PENDING . "'"); 

    return $builder->getQuery()->execute(); 

zurückkehrt einen Fehler:

[Syntax Error] line 0, col 106: Error: Expected Literal, got 'JOIN' 

Dies ist die gebildete Abfrage:

SELECT p FROM ProProposalBundle:Proposal p LEFT JOIN ProProposalBundle:Proposal:Vote v LEFT JOIN ProUserBundle:User u LEFT JOIN p.convocation c WHERE v.proposal = p AND v.user = u AND (v.decision = "in_favor" OR v.decision = "against") AND u = :user AND p.community = :community AND (p.convocation IS NULL OR c.status = 'pending') ORDER BY p.created desc 

LEFT JOIN fehlt der ON oder WITH Zustand. Die Frage ist: Was mache ich falsch mit der DQL-Abfrage? Bin ich falsch mit leftJoin() Methode?

Antwort

13

Lehre ORM braucht Sie, welche Beziehung zu erzählen verbunden ist, nicht das Unternehmen selbst (du hast es gut mit p.convocation):

$builder->select('p') 
    ->from('ProProposalBundle:Proposal', 'p') 
    ->leftJoin('ProProposalBundle:Proposal\Vote', 'v', 'WITH', 'v.proposal = p AND v.user = :user AND (v.decision = :in_favor OR v.decision = :against)') 
    ->setParameter('user', $options['user']) 
    ->setParameter('in_favor', 'in_favor') 
    ->setParameter('against', 'against') 
    ->andWhere('p.community = :community') 
    ->setParameter('community', $community) 
    ->andWhere('p.archived = :archived') 
    ->setParameter('archived', $options['archived']) 
    ->leftJoin('p.convocation', 'c') 
    ->andWhere("p.convocation IS NULL OR c.status = :pending") 
    ->setParameter('pending', Convocation::STATUS_PENDING); 

return $builder->getQuery()->execute(); 

bearbeiten: Ich inversed Abstimmung Beziehung, wie Sie kommentiert und entfernt unbrauchbare WHERE-Klauseln (Doctrine löst automatisch die JOIN ON-Klausel auf. Ich übertrage auch einige WHERE-Klauseln über Joins in den optionalen Parametern (WITH in DQL).

edit2: Ohne Beziehung zwischen Vorschlag und Abstimmung, nicht sicher, ob es funktioniert.

edit3: Am besten verwenden Sie setParameter für alle Werte in WHERE-Klauseln.

+0

Oh! Gut. Die Sache ist, dass 'p.vote' nicht existiert (nur' v.proposal'). und weder 'p.user' (nur' v.user'). – Manolo

+0

Sie sollten umgekehrte Beziehungen wie p.votes haben und Sie können v.user verwenden (ich habe meine Antwort bearbeitet) – AlterPHP

+0

Jeder Weg, um es zu erreichen, ohne Beziehung wie 'p.votes' hinzuzufügen? Es muss möglich sein. – Manolo

Verwandte Themen