2015-01-14 3 views
0

У меня следующая ситуация: таблица с именем HRMgmt содержит событие, происходящее пользователь, вызванное другого пользователь, так что в моем классе сущностей у меня есть:Symfony2/Doctrine2 двойной присоединиться

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

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

Я хочу сделать дважды присоединиться, чтобы получить как ID, имя и фамилию пользователя, это событие связано с и ид, имя и фамилию пользователя, который вызвал событие HRMgmt (так называемый 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 Неизвестная колонка 'h2_.user_id' in 'on'

Правильно ли выполнено соединение? Что мне здесь не хватает?

Вопрос аналогичен следующему: JOIN DQL (symfony2) multiple joins between two tables

На самом деле мой случай еще проще, так как я не могу иметь нулевые значения ...

Моего DB находится в синхронизации с моим лицом, имеющим пробег:

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

EDIT:

вот схема 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 

Спасибо!

+0

Можете ли вы показать нам схему БД для объектов «AppBundle: HRMgmtEvent» и «AppBundle: User»? –

ответ

0

Оба свойства сопоставляются с одним и тем же поле в БД, user_id, который является сопоставлением по умолчанию для Doctrine on 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; 

После этого вы сможете сделать свое соединение.

+0

Звучит многообещающе, но ... такая же ошибка :(Я также попытался изменить запрос, заменив h.user на h.user_id (и тот же для другого), но он говорит мне, что «HRMgmtEvent не имеет ассоциации с именем user_id» (которая была ожидаемый, но, вы знаете ...) –

+0

какая ошибка вернулась? точно так же? Вы пытались установить ВКЛ вручную для соединений? – lsouza

+1

Я решил, что проблема заключалась в том, что я также должен был присоединиться к роли таблица: «INNER JOIN h.role r» вместо предложения «AND h.role = r.id» –

Смежные вопросы