我有以下情况:名为HRMgmt的表包含由另一个用户引起的某个用户发生的事件,因此在我的实体类中有:

/**
 * @ORM\ManyToOne(targetEntity="User")
 */
protected $user;

/**
 * @ORM\ManyToOne(targetEntity="User")
 */
protected $changed_by;

我想进行双重联接以获取与此事件相关的用户的ID,名称和姓氏,以及导致HRMgmt事件的用户的ID,名称和姓氏(称为changed_by)

我的查询建立如下:

$events = $this->getEntityManager()
        ->createQuery(
        'SELECT u1.id currentuserid, u1.name currentusername, u1.surname currentusersurname, u2.id changedbyuserid, u2.name changedbyusername, u2.surname changedbyusersurname, h.is_active, h.timestamp, h.started_at, h.finished_at, r.name rolename FROM AppBundle:HRMgmtEvent h, AppBundle:Role r
         INNER JOIN h.user u1
         INNER JOIN h.changed_by u2
         WHERE h.project = :projectid
         AND h.role = r.id
         ORDER BY h.timestamp DESC, h.is_active DESC' 
        )
        ->setParameter('projectid', $project->getId())
        ->getResult();

但是会引发以下错误找不到列:1054'on子句'中的未知列'h2_.user_id'

连接是否正确执行? 我在这里想念什么?

问题类似于以下内容: JOIN DQL(symfony2)两个表之间的多个联接

其实我的情况更简单,因为我不能有空值...

我的数据库与我已运行的实体同步:

php app/console doctrine:schema:update --force

编辑:

这是HRMgmt的架构:

CREATE TABLE `hrmgmt` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) DEFAULT NULL,
`project_id` int(11) DEFAULT NULL,
`changed_by_id` int(11) DEFAULT NULL,
`started_at` datetime DEFAULT NULL,
`finished_at` datetime DEFAULT NULL,
`is_active` tinyint(1) NOT NULL,
`timestamp` datetime NOT NULL,
`role_id` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `IDX_B3C74883A76ED395` (`user_id`),
KEY `IDX_B3C74883828AD0A0` (`changed_by_id`),
KEY `IDX_B3C74883166D1F9C` (`project_id`),
KEY `IDX_B3C74883D60322AC` (`role_id`),
CONSTRAINT `FK_B3C74883166D1F9C` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`),
CONSTRAINT `FK_B3C74883828AD0A0` FOREIGN KEY (`changed_by_id`) REFERENCES `fos_user` (`id`),
CONSTRAINT `FK_B3C74883A76ED395` FOREIGN KEY (`user_id`) REFERENCES `fos_user` (`id`),
CONSTRAINT `FK_B3C74883D60322AC` FOREIGN KEY (`role_id`) REFERENCES `roles` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1042 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

这是用户:

CREATE TABLE `fos_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
...several other fields...
`name` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`surname` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `UNIQ_957A647992FC23A8` (`username_canonical`),
UNIQUE KEY `UNIQ_957A6479A0D96FBF` (`email_canonical`)
) ENGINE=InnoDB AUTO_INCREMENT=23 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

谢谢!

#1楼 票数:0

这两个属性都映射到数据库上的同一字段user_id ,这是Doctrine在ManyToOne关联(model_id)上的默认映射。 为了解决这个问题,您应该为每个属性选择不同的列名称,如下所示:

/**
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="user_id")
 */
protected $user;

/**
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="changed_by_id")
 */
protected $changed_by;

之后,您应该可以加入。

  ask by Sergio Negri translate from so

未解决问题?本站智能推荐:

1回复

Doctrine2在同一表上的连接计数返回空数组

假设有两条消息,employeeId = 1,responseTo =0。其中一条消息也有两个响应(因此,另两个记录的responseTo = messageId)。 另一个没有。 我从该查询中期望的结果是两个数组,其中实体对象为索引0,计数为索引numResponses(第一行的值为2,第
3回复

Symfony2Doctrine2多对多将所有实体及其关系实体

如何使用一个SELECT来选择一个表中的所有实体以及另一个表中的实体来进入控制器? 例如,如果我有一个表:应用程序和类别(很多实现),而我想使用一个SELECT来获取其类别的所有应用。 怎么做 ? 内部联接 ? 然后我想建立一个像这样的数组: 我试图做这样的事情: 但我不知道
1回复

symfony2多个左联接,内部联接

使用symfony2,但更多的是MySQL问题... 我认为我有很好的表架构(只是重要字段)(代码是不言自明的): 用户(id)状态(id)喜欢(id,user_id,status_id)注释(id,user_id,status_id) 我正在做出重大选择。 正在尝试这样做:
1回复

Doctrine内部连接与querybuilder的“一对多”关系

我有跟随ER,我需要使用查询生成器在Symfony2-Doctrine中执行以下查询(仅在请求特定过滤器时使用连接) 目标宣言 会话类不包含对目标的任何引用 通过阅读在线文档,似乎学说要求在实体会话上存在列以执行请求的连接。 是真的如此,还是有另一种方式? 我的QueryBui
1回复

Symfony主义没有重复价值

我花了几个小时试图用Doctrine进行查询以根据距离读取位置数据(位置实体),但相应地,位置(位置实体)的值仅对相应用户(司机实体)重复一次。 我的位置实体: ID 司机(ManyToOne到司机实体) 纬度 经度 准确性 高度 .... 我的
1回复

Symfony2-连接错误内的子查询

我想在联接内使用子查询,但是Symfony2抛出以下错误: 这是我失败的尝试: 基本上我只是加入3个表,第三个表有个数。 在数据库内部执行查询时,该查询有效。 联接中如何使用SELECT语句? 此时使用原始SQL是一个好主意吗?
1回复

尝试在symfony中建立内部连接

当我尝试进行以下内部联接时,出现错误“ QueryException:[语义错误]第0行,'idPat =:idP'附近的col 136:错误:类PermissionRolePrl没有名为idPat的字段或关联” : 为此,我做了以下工作: 表pra包含以下列:idPra(PK),idP
3回复

使用Symfony主义对多个表(12)执行内部联接的最佳方法

我正在使用Symfony和Doctrine用FosrestBundle构建一个api。 我想创建一个带有get的资源,该资源将从具有12个以上表的“内部联接”结果中输出json数据。 为此,我想在存储库中创建一个带sql的查询,然后在我的控制器中检索它。 这是一个好方法还是更好的方法?