2012-04-06 17 views
12

Próbuję użyć konstruktora zapytań, aby wybrać wszystkie kategorie należące do danej superkategorii (kategoria i superKategoria mają wiele do wielu relacji). Nie mogę jednak zbudować prawidłowego zdania konstruktora kwerendy, ponieważ nie wiem, jak odwołać się do superkategorii z mojej kategorii, ponieważ w moim identyfikatorze kategorii nie ma pola superkategorii.Konstruktor zapytań dołącz do wielu relacji

Obiekty w bazie wyglądać następująco:

Category: 
    id 
    name 

SuperCategory 
    id 
    name 

categories_superCategories 
    id 
    category_id 
    superCategory_id 

Oto definicja moich obiektów (pliki yml):

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 

i

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 

Jak budować zdanie budującego zapytania, aby uzyskać kategorie należące do określonej superkategorii?

Kwerenda w moim CategoryRepository:

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

Dziękuję ...

Odpowiedz

27

Got go:

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

Problem polegał na tym, że miałem prosić o c.superCategories a nie c.superCategory!

2

Coś jak:

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