【发布时间】:2023-03-12 13:42:02
【问题描述】:
我有一个与 companyType 具有多对多关系的用户实体:
/**
* @ORM\ManyToMany(targetEntity="App\Entity\CompanyType")
* @ORM\OrderBy({"name" = "ASC"})
* @ORM\JoinColumn(nullable=true)
*/
private $companyTypes;
还有一个可以有 0 种或多种类型的 Company 实体:
/**
* @ORM\ManyToMany(targetEntity="App\Entity\CompanyType", inversedBy="companies")
* @ORM\OrderBy({"name" = "ASC"})
* @ORM\JoinColumn(nullable=true)
*/
private $companyTypes;
这会在我的数据库中创建一个 user_companyType 表。
我想用 Doctrine queryBuilder 构建一个查询,如果 u.companyTypes 中的至少一个元素在 c.companyTypes 中,则该查询返回。
我找不到怎么做。
这是我尝试过的:
$userCompanyTypes = array();
foreach ($user->getCompanyTypes() as $companyType) {
$userCompanyTypes[] = $companyType;
}
$qb = $this->_em->createQueryBuilder('i')
->from(Invoice::class, 'i')
->leftJoin('i.account', 'a')
->leftJoin('i.company', 'c')
->leftJoin('c.companyTypes', 'ct')
->leftJoin('a.users', 'u')
->andWhere("c.companyTypes IN (:userCompanyTypes)") // ... search if there's a match
->setParameter("userCompanyTypes", $userCompanyTypes);
return $qb->getQuery()->getResult();
长话短说:
一个帐户包含多个用户
发票始终与帐户和公司相关联
CompanyType 是一个对象,而不是字符串
我要获取的发票是与用户拥有权限的公司相关联的发票(= 用户拥有公司本身拥有的 companyType)
还有什么我可以与查询生成器一起使用的吗?
【问题讨论】:
-
试试 $qb->add('where', $qb->expr()->in("c.companyTypes'', $userCompanyTypes));
-
好吧。 '... some where 子句' 可能没有帮助。你把你的查询压缩得有点太多了,以至于有人帮不上忙。使用实际查询更新问题。继续,如果需要,只需完全删除 []。但是给我们一个真实的查询并验证 $userCompanyTypes 是一个数组。
-
@Albeis 不需要使用 expr。假设查询的其余部分是正确的,问题中显示的 andWhere 子句将正常工作。
-
然后等待完整的查询!
-
我用更多信息更新了查询,感谢您的帮助!