查询构建器有多对多的关系

时间:2013-04-15 10:51:48

标签: symfony doctrine many-to-many query-builder

我在多对多的关系中面临着查询构建器的一些麻烦。

我有一家实体公司也有子公司,所以我有:

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;

[...]

}

然后我尝试创建一个查询构建器,该构建器返回具有已确定子公司的公司(例如,具有id为5的子公司)。我试过两种方式:

方法A)

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

它没有工作并且给我错误:Class Application \ Sademer \ CoreBundle \ Entity \ Company没有名为子公司的字段或关联

方法B)

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

它没有工作并给我错误:无效的PathExpression。期望StateFieldPathExpression或SingleValuedAssociationField。

谢谢! ;)

3 个答案:

答案 0 :(得分:12)

你应该能够检查j.id:

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

如果您查看第一次出现的错误,您可以看到您拥有公司实例,这意味着您应该查询公司字段。当您加入别名时,您可以针对目标实体而不是连接表编写查询。

答案 1 :(得分:12)

在没有使用join语句的情况下,您应该添加以下代码以提取子公司ID = 5的公司

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

学说会为你付出艰辛的努力。 有一个很好的编码时间!

答案 2 :(得分: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;
}