具有多个值的Doctrine Query Builder IN子句

问题描述 投票:2回答:1

我有一个用户实体,它与companyType具有ManyToMany关系:

/**
 * @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)

我还可以与查询构建器一起使用来执行此操作吗?

php symfony doctrine
1个回答
2
投票

我通常不喜欢不设置测试用例就回答这类问题。您的错误消息有些奇怪,但我会尝试一下。我知道IN子句将使用单个ID。所以也许:

$userCompanyTypeIds = array();
foreach ($user->getCompanyTypes() as $companyType) {
    $userCompanyTypeIds[] = $companyType->getId();
}
$qb = $this->_em->createQueryBuilder('i')
->select('count(DISTINCT i.id)')
->from(Invoice::class, 'i')
->leftJoin('i.account', 'a')
->leftJoin('i.company', 'c')
->leftJoin('c.companyTypes', 'ct')
->leftJoin('a.users', 'u')
->andWhere("ct.id IN (:userCompanyTypeIds)") // ... search if there's a match 
->setParameter("userCompanyTypeIds", $userCompanyTypeIds);

$count = $qb->getQuery()->getSingleScalarResult();

至少应该使您更进一步。更新了显示如何获得总数的答案。即使它很常见,也从不热衷于使用expr类。

© www.soinside.com 2019 - 2024. All rights reserved.