查询生成器关系ManyToMany,没有关联实体

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

上下文是一个与 Doctrine 3 连接的 Symfony 6 项目。我在 Projet 和 Employe 之间有多对多关系,并且在项目的列表页面中我只想显示为其分配了登录用户(Employe)的项目。因此,目标是使用 ProjetRepository 中的 tue queryBuilder 返回该列表,并使用以 Employe 作为参数的方法。我可以提供我正在从事的开源项目的链接:因此,使用 LAmp Wamp 或任何具有 Php 8.3 和 Apache 服务器的堆栈(您想要的任何数据库),您可以克隆主分支。请注意,工作正在进行中,因此即使使用 DataFixtures,您也无法使用预加载的数据以教条方式登录。但是您将能够注册另一个用户,并在数据库中设置角色。

你可以克隆这个:https://gitlab.com/HenriLabe/task-linker-example.git (然后添加一个用户,在您的数据库中为他添加一个 ADMIN 角色以便编辑项目

我尝试获取与给定其他实体(雇员)相关的所有实体(项目),实体被映射为多对多。 我想在我想要获取列表的实体的存储库中使用查询生成器 我有一段代码不会引发任何异常或错误,但返回的数组为空,而数据按照我想要的方式在数据库中设置

public function findProjectsByGrantedEmployee(Employe $employe): array 
{
    $employeId = $employe->getId();
    $query = $this->createQueryBuilder('p')->andWhere(':employeId IN (\'p.employes\')')->setParameter('employeId', $employeId)->getQuery();

    return $query->getResult();
}
symfony doctrine many-to-many query-builder
1个回答
0
投票

让我们调试您的数据库查询

-dql: "SELECT p FROM App\Entity\Project p WHERE :employeId IN ('p.employes')"

雇主 ID (:employeId) 位于 p.employes 字段中。但是,p.employes 不是数据中的主要字段。这是一种多对多关系,用于通过中间表传递数据。以文本“p.employes”形式查询控件 ID 是没有意义的。

我提出两种解决方案。

使用实体类中的集合

public function __construct(
    private readonly EmployerRepository $employerRepository
) {
}

#[Route('/test', name: 'app_test')]
public function index()
{
    $employer = $this->employerRepository->find(1);
    $result = $employer->getProjects()->toArray(); <--- get collection
    dd($result);
}

使用 QueryBuilder 创建有效的查询

public function findProjectsByEmployer(Employer $employer): array
{
    return $this->createQueryBuilder('p')
        ->innerJoin('p.employer', 'e', Join::WITH, 'e = :employer')
        ->setParameter('employer', $employer)
        ->getQuery()
        ->getResult();
}

表project_emplpyer数据:

Table project_emplpyer data

转储结果,有两种方式:

Dump result

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