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

Ang*_*gel 3 doctrine many-to-many query-builder symfony

在多对多的关系中,我遇到了查询构建器的一些麻烦.

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

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;

[...]

}
Run Code Online (Sandbox Code Playgroud)

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

方法A)

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

它不起作用并给我错误:类Application\Sademer\CoreBundle\Entity\Company没有名为子公司的字段或关联

方法B)

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

它不起作用,并给我错误:无效的PathExpression.期望StateFieldPathExpression或SingleValuedAssociationField.

谢谢!!!;)

sam*_*sou 13

还有另一种不使用join语句的方法,你应该添加以下代码来提取子公司Id = 5的公司

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

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

  • 我喜欢这个答案!更多[DQL Select 示例](http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples) (2认同)

Luk*_*uke 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);
Run Code Online (Sandbox Code Playgroud)

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