我有以下情况:- 我记录"人力资源管理"事件(更改角色,分配给项目,停用)- 我有一个"角色"表,其中有一个角色列表。每个角色都有以下字段
/**
* @ORMEntity(repositoryClass="AppBundleEntityRoleRepository")
* @ORMTable(name="roles")
* @UniqueEntity(fields={"name","project"}, ignoreNull=false, message="Duplicated role for this project")
*/
class Role
{
/**
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORMColumn(type="string", length=100)
*/
protected $name;
/**
* @ORMColumn(type="boolean")
*/
protected $Personal_profile__view;
/**
* @ORMColumn(type="boolean")
*/
protected $Personal_profile__change;
...many other boolean permissions
/**
* @ORMManyToOne(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 实体如下:
/**
* @ORMEntity(repositoryClass="AppBundleEntityHRMgmtEventRepository")
* @ORMTable(name="HRMgmt")
*/
class HRMgmtEvent
{
/**
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORMColumn(type="datetime")
*/
protected $timestamp;
/**
* @ORMManyToOne(targetEntity="User")
*/
protected $user;
/**
* @ORMManyToOne(targetEntity="Project")
*/
protected $project;
/**
* @ORMColumn(type="datetime", nullable=true)
*/
protected $started_at;
/**
* @ORMColumn(type="datetime", nullable=true)
*/
protected $finished_at;
/**
* @ORMColumn(type="boolean")
*/
protected $is_active;
/**
* @ORMManyToOne(targetEntity="User")
*/
protected $changed_by;
/**
* @ORMManyToOne(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 AppBundleEntityHRMgmtEvent 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