上下文是一个与 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();
}
让我们调试您的数据库查询
-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数据:
转储结果,有两种方式: