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

时间:2015-01-14 14:05:23

标签: php symfony doctrine-orm

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

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

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

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

    $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中映射回来时,我只有一条记录。

如果另一方面,我没有检索整个实体Role 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 rolename" (离开JOIN)我没有问题。

EDIT2:

进行一些额外的研究我考虑使用" partial"如下:

'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.

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

1 个答案:

答案 0 :(得分:0)

我终于明白了,我不得不修改我的查询如下:

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

的文档中没有发现任何相关内容