为什么此 EntityManager 查询不返回任何内容?

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

我有一个 User 实体和一个 HistoryAccess 实体,它们绑定两个 User 实例,如下所示:其中指定为“允许”的用户可以获取指定为“所有者”的用户。

我正在尝试进行一个查询,该查询将接收当前用户可用的所有用户的数据。查询码:

$user = $security->getUser();
$userId = $user->getId()->toRfc4122();

return $entityManager->createQueryBuilder()
    ->from('App\Entity\User', 'u')
    ->join('u.ownerHistoryAccesses', 'ha')
    ->join('ha.allowed', 'a')
    ->where('a.id = :currentUserId')
    ->setParameter('currentUserId', $userId)
    ->select('u, ha, a.id')
    ->getQuery()
    ->getArrayResult();

但是这个查询没有返回任何内容

如果我删除 andWhere 和 setParameter 行,结果是预期的数据集,其中 a.id 与 $userId 值具有相同的标识符。为什么使用 andWhere 和 setParameter 的请求没有返回任何内容?

doctrine-orm doctrine query-builder
1个回答
-1
投票

从您的描述来看,您似乎想要根据 HistoryAccess 实体检索当前用户可以访问的用户列表,其中当前用户是“允许”用户,“所有者”用户是您想要的用户检索。为了实现这一点,您可以使用不同的方法。您可以获取当前用户的 HistoryAccess 实体,然后从这些 HistoryAccess 实体中提取“所有者”用户。

这是一个修改后的查询来实现这一点:

$user = $security->getUser();
$userId = $user->getId()->toRfc4122();

return $entityManager->createQueryBuilder()
    ->select('u')
    ->from('App\Entity\User', 'u')
    ->leftJoin('u.ownerHistoryAccesses', 'ha')
    ->leftJoin('ha.allowed', 'a')
    ->where('a.id = :currentUserId')
    ->setParameter('currentUserId', $userId)
    ->getQuery()
    ->getResult();

在此查询中:

  1. 我们首先选择用户实体(“u”),因为您想要检索用户。
  2. 我们使用 leftJoin 而不是 join 来确保没有匹配 HistoryAccess 的用户仍包含在结果中。
  3. 我们使用 leftJoin 将允许的用户加入 HistoryAccess 实体。 我们过滤结果,仅包含 a.id(“允许的”用户)等于 :currentUserId(当前用户的 ID)的用户。
© www.soinside.com 2019 - 2024. All rights reserved.