我在多对多的关系中面临着查询构建器的一些麻烦。
我有一家实体公司也有子公司,所以我有:
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。
谢谢! ;)
答案 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;
}