Symfony2/Doctrine:检索引用其他实体的记录时出现问题


Symfony2/Doctrine: problems retrieving records with references to other entities

我有以下情况:- 我记录"人力资源管理"事件(更改角色,分配给项目,停用)- 我有一个"角色"表,其中有一个角色列表。每个角色都有以下字段

/**
* @ORM'Entity(repositoryClass="AppBundle'Entity'RoleRepository")
* @ORM'Table(name="roles")
* @UniqueEntity(fields={"name","project"}, ignoreNull=false, message="Duplicated role for this project")
*/
class Role
{
/**
 * @ORM'Column(type="integer")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="AUTO")
 */
protected $id;
/**
 * @ORM'Column(type="string", length=100)
 */
protected $name;
/**
 * @ORM'Column(type="boolean")
 */
protected $Personal_profile__view;
/**
 * @ORM'Column(type="boolean")
 */
protected $Personal_profile__change;
...many other boolean permissions
/**
 * @ORM'ManyToOne(targetEntity="Project")
 */
protected $project;
角色

通常链接到任何项目(因此最后一个字段可以为空),但也可以是项目相关的(对于自定义角色)。

我运行以下查询以获取与用户相关的所有项目:

    $projects = $this->getEntityManager()
        ->createQuery(
        'SELECT p.id projectID, p.name, p.description, h.is_active resourceIsActive, r role, h.timestamp
         FROM AppBundle:Project p, AppBundle:HRMgmtEvent h, AppBundle:Role r
         WHERE h.user = :userid
         AND h.project=p.id
         AND h.role=r.id
         ORDER BY h.timestamp ASC'
        )->setParameter('userid', $user->getId())
         ->getResult();

我希望能够检索整个"角色"r,以便在我的控制器中我可以"获取"与之关联的任何布尔权限。

如果所有

"r"都不同(基本上如果HRMgmnt事件的role_id不同),则所有工作都像魅力一样工作。如果它们相同,就会发生一些非常奇怪的事情:我在探查器中读取的查询正确检索信息(例如检索 2 条记录),但是当该信息在 PHP 中映射回时,我只有一条记录。

另一方面,如果不是检索整个实体角色 r,而是检索 role.name 角色。

知道如何解决它吗?

谢谢!

我的 HRMgmt 实体如下:

/**
 * @ORM'Entity(repositoryClass="AppBundle'Entity'HRMgmtEventRepository")
 * @ORM'Table(name="HRMgmt")
 */
class HRMgmtEvent
{
/**
 * @ORM'Column(type="integer")
 * @ORM'Id
 * @ORM'GeneratedValue(strategy="AUTO")
 */
protected $id;
/**
 * @ORM'Column(type="datetime")
 */
protected $timestamp;
/**
 * @ORM'ManyToOne(targetEntity="User")
 */
protected $user;
/**
 * @ORM'ManyToOne(targetEntity="Project")
 */
protected $project;
/**
 * @ORM'Column(type="datetime", nullable=true)
 */
protected $started_at;
/**
 * @ORM'Column(type="datetime", nullable=true)
 */
protected $finished_at;
/**
 * @ORM'Column(type="boolean")
 */
protected $is_active;
/**
 * @ORM'ManyToOne(targetEntity="User")
 */
protected $changed_by;
/**
 * @ORM'ManyToOne(targetEntity="Role")
 */
protected $role;

编辑:

我按照建议使用 JOIN 替换了我的查询:

'SELECT p.id projectID, p.name, p.description, h.is_active resourceIsActive, r role, h.timestamp FROM AppBundle:HRMgmtEvent h
 INNER JOIN h.project p
 INNER JOIN h.role r
 WHERE h.user = :userid
 ORDER BY h.timestamp ASC'

如果我以这种方式离开它,我会得到错误:

[Semantical Error] line 0, col -1 near 'SELECT p.id projectID,': Error: Cannot select entity through identification variables without choosing at least one root entity alias.

如果我改为检索"r.name 角色名"(离开 JOIN),我没有问题。

编辑2:

做一些额外的研究,我想使用"部分"如下:

'SELECT  partial p.{id, name, description}, partial h.{project, role, is_active, timestamp}, r FROM AppBundle:HRMgmtEvent h
 INNER JOIN h.project p
 INNER JOIN h.role r
 WHERE h.user = :userid
 ORDER BY h.timestamp ASC'

但我得到以下几点:

[Semantical Error] line 0, col 89 near '}, r FROM AppBundle:HRMgmtEvent': Error: The partial field selection of class AppBundle'Entity'HRMgmtEvent must contain the identifier.

请注意,我包含了指向"p"和"r"的"h"两个外键。

我终于想通了,我不得不修改我的查询,如下所示:

SELECT  p.id projectID, p.name, p.description, partial h.{id, project, role, is_active, timestamp} hrevent, r FROM AppBundle:HRMgmtEvent h
 INNER JOIN h.project p
 INNER JOIN h.role r
 WHERE h.user = :userid
 ORDER BY h.timestamp ASC
我之所以像这样检索"p"的

字段而不是部分的字段,是因为我不想更改我在查询后已经编写的逻辑,该逻辑期望该格式的数据,但我测试了它,它也适用于"p"上的部分。

请注意,此解决方案与 EDIT2 中提供的解决方案之间的唯一区别是我也检索了"h"的 id。我在这里的文档中没有找到任何关于它的参考 http://docs.doctrine-project.org/en/latest/reference/dql-doctrine-query-language.html#partial-object-syntax