2012-04-06 5 views
12

Ich versuche Query Builder zu verwenden, um alle Kategorien auszuwählen, die zu einer bestimmten SuperCategory gehören (Kategorie und SuperCategory haben eine Viele-zu-viele-Beziehung). Ich kann jedoch keinen korrekten Abfrage-Generator-Satz erstellen, weil ich nicht weiß, wie ich auf die Super-Kategorie aus meiner Kategorie verweisen soll, da es in meiner Kategorie-ID kein Super-Kategorie-Feld gibt. schauenQuery Builder Join auf viele zu viele Beziehung

Die Objekte in der Datenbank wie:

Category: 
    id 
    name 

SuperCategory 
    id 
    name 

categories_superCategories 
    id 
    category_id 
    superCategory_id 

Hier ist die Definition meiner Objekte (yml Dateien) sind:

YOP\YourOwnPoetBundle\Entity\TraitCategory: 
    type: entity 
    repositoryClass: YOP\YourOwnPoetBundle\Repository\TraitCategoryRepository 
    table: null 
    fields: 
    id: 
     type: integer 
     id: true 
     generator: 
     strategy: AUTO 
    name: 
     type: string 
     length: '255' 
    lifecycleCallbacks: { } 
    manyToMany: 
    superCategories: 
     targetEntity: SuperCategory 
     joinTable: 
     name: traitCategories_superCategories 
     joinColumns: 
      traitCategory_id: 
      referencedColumnName: id 
     inverseJoinColumns: 
      superCategory_id: 
      referencedColumnName: id 

und

YOP\YourOwnPoetBundle\Entity\SuperCategory: 
    type: entity 
    repositoryClass: YOP\YourOwnPoetBundle\Repository\SuperCategoryRepository 
    table: null 
    fields: 
    id: 
     type: integer 
     id: true 
     generator: 
     strategy: AUTO 
    name: 
     type: string 
     length: '255' 
    lifecycleCallbacks: { } 
    manyToMany: 
    msgCategories: 
     targetEntity: MsgCategory 
     mappedBy: superCategories 
    traitCategories: 
     targetEntity: TraitCategory 
     mappedBy: superCategories 

Wie würde ich bauen ein Abfrage-Builder-Satz, um die Kategorien zu erhalten, die zu einer bestimmten SuperCategory gehören?

Die Abfrage in meinem CategoryRepository:

$this->createQueryBuilder('c') 
      ->innerJoin(??????) 
      ->setParameter('superCategoryName', $superCategoryName); 

Danke ...

Antwort

27

Verstanden:

public function findBySuperCategoryName($superCategoryName) 
{ 
    return $this->createQueryBuilder('c') 
      ->innerJoin('c.superCategories', 's', 'WITH', 's.name = :superCategoryName') 
      ->setParameter('superCategoryName', $superCategoryName); 
} 

Das Problem war, dass ich hatte um c.superCategories und nicht c.superCategory zu fragen!

2

Etwas wie:

$this->createQueryBuilder() 
     ->select('s') 
     ->from('SuperCategory', 's') 
     ->innerJoin('s.Category c ON c.category_id = s.superCategory_id') 
     ->where('s.name = :superCategoryName') 
     ->setParameter('superCategoryName', $superCategoryName) 
     ->getQuery() 
     ->getResult();