7

我在多对多关系中遇到了查询生成器的一些问题。

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

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 的子公司)。我尝试了两种方式:

方法一)

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

它不起作用并给我错误:Class Application\Sademer\CoreBundle\Entity\Company has no field or association named subcompany

方法 B)

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

它不起作用并给我错误:无效的 PathExpression。需要 StateFieldPathExpression 或 SingleValuedAssociationField。

4

3 回答 3

30

还有另一种不使用 join 语句的方法,您只需添加以下代码即可提取 subcompanyId = 5 的公司

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

教义会为你做艰苦的工作。祝您编码愉快!

于 2015-07-10T11:09:20.880 回答
13

您应该能够检查 j.id:

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

如果您查看第一次遇到的错误,您会看到您有一个 Company 实例,这意味着您应该查询 Company 字段。当您连接别名时,您会针对目标实体而不是连接表编写查询。

于 2013-04-15T13:06:42.563 回答
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;
}
于 2014-02-23T12:28:53.493 回答