2013-04-15 118 views
3

我在多對多關係中遇到查詢生成器的一些麻煩。查詢生成器多對多關係

我有一個實體公司,擁有子公司一樣,所以我有:

class Company { 

private $id; 

/** 
* @var ArrayCollection 
* 
* @ORM\ManyToMany(targetEntity="Company") 
* @ORM\JoinTable(name="company_relation", 
* joinColumns={ 
*  @ORM\JoinColumn(name="id", referencedColumnName="id") 
* }, 
* inverseJoinColumns={ 
*  @ORM\JoinColumn(name="subcompany", referencedColumnName="id") 
* } 
*) 
*/  
private $ChildrenCompany; 

[...] 

} 

然後我試圖做一個查詢生成器,它返回已determinated子公司(例如子公司ID爲5家公司)。我試圖在兩個方面:

方法A)

$query->select ('c'); 
$query->from(MyBundle:Company, 'c'); 
$query->leftJoin('c.ChildrenCompany','j'); 
$query->where('j.subcompany = 5'); 

它不工作,並給我的錯誤:類應用程序\ Sademer \ CoreBundle \實體\公司沒有字段或協會命名子公司

方法B)

$query->select ('c'); 
$query->from(MyBundle:Company, 'c'); 
$query->where('j.ChildrenCompany = 5'); 

它不工作,並給我的錯誤:無效PathExpression。 StateFieldPathExpression或SingleValuedAssociationField預期。

謝謝! ;)

+0

你能發表更多的代碼。例如,你實例化查詢生成器的地方。 – RHarrington

+0

我實例化查詢生成器,如: $ query = $ this-> getModelManager() - > createQuery(MyBundle:Company,'entity'); – Angel

回答

10

你應該只能夠檢查j.id:

$query->select ('c'); 
$query->from(MyBundle:Company, 'c'); 
$query->leftJoin('c.ChildrenCompany','j'); 
$query->where('j.id = :subCompanyId'); 
$query->setParameter("subCompanyId", 5); 

如果你看一下錯誤你都拿到第一時間,你可以看到你有公司的實例,這意味着你應該在公司領域查詢。當您加入別名時,您將針對目標實體編寫查詢,而不是連接表。

+0

對,但它是任何形式來嘗試反對連接表?因爲連接表根本不是一個實體,而是一個關係。 :( – Angel

+0

如果需要,可以爲連接表創建實體,然後將該實體上的多對一關係設置爲具有多對多關係的兩個表。如果您需要另一列多對多表格 – Luke

2

做這樣的

Aisel\PageBundle\Entity\Page: 
type: entity 
table: aisel_page 
repositoryClass: Aisel\PageBundle\Entity\PageRepository 
id: 
    id: 
     type: integer 
     id: true 
     generator: 
      strategy: AUTO 
fields: 
    ... 

manyToMany: 
    categories: 
    targetEntity: Aisel\CategoryBundle\Entity\Category 
    joinTable: 
     name: aisel_page_category 
     joinColumns: 
     page_id: 
      referencedColumnName: id 
     inverseJoinColumns: 
     category_id: 
      referencedColumnName: id 

而在你的功能

public function getPagesByCategory($categoryId) 
{ 
    $qb = $this->getEntityManager()->createQueryBuilder(); 

    $categoryId = 291; // CategoryId 
    $r = $qb->select('p') 
     ->from('AiselPageBundle:Page', 'p') 
     ->innerJoin('p.categories','c') 
     ->where('p.status = 1') 
     ->andWhere('p.isHidden != 1') 
     ->andWhere('c.id = :categoryId')->setParameter('categoryId',$categoryId) 
     ->getQuery() 
     ->execute(); 

    return $r; 
} 
8

有不使用連接語句的另一種方法,你應該只添加以下代碼到公司與subcompanyId =提取5

$query->where(':subCompanyId MEMBER OF c.ChildrenCompany'); 
$query->setParameter("subCompanyId", 5); 

而主義會爲你做出辛苦的工作。 有一個很好的編碼時間!

+0

我喜歡這個答案!更多[DQL Select Examples](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query- language.html#DQL選-示例) –