doctrine2 - сущность является членом - PullRequest
0 голосов
/ 25 октября 2011

для примера:

У меня есть следующая схема:

users(id, name)
groups(id,name)
user_groups(user_id, group_id)

Я хочу получить пользователей, которые принадлежат к определенной группе. проблема в том, что я знаю идентификатор группы, поэтому я не хочу присоединяться к таблице групп - достаточно user_groups.

результат должен быть

SELECT * FROM `users` AS u
LEFT JOIN `user_groups` AS ug ON (ug.`user_id` = u.`id)
WHERE ug.`group_id` = X
// i know the value of X

мои попытки в доктрине2 привели к другому соединению таблицы groups.

Самая близкая вещь, которую я получил:

SELECT u FROM models\User u WHERE ?1 MEMBER OF u.groups

но он также СЛЕДУЕТ ПРИСОЕДИНИТЬСЯ к нему внутри "ГДЕ СУЩЕСТВУЕТ (...)"

можно ли это сделать без встроенного запроса (с использованием DQL / построителя запросов)?

Ответы [ 2 ]

3 голосов
/ 25 октября 2011

Одним из преимуществ ORM по сравнению с шаблоном ActiveRecord является то, что вам не нужно создавать новую сущность для объединяемых таблиц.

Так что здесь, когда вы используете Doctrine, таблица user_groups будет отображенас обеих сторон.

Это означает, что вы не можете получить прямой доступ к таблице user_groups.Если вы не используете нативный sql, против которого я настоятельно советую.

Так что лучший способ справиться с вашей ситуацией - это использовать findOneBy($group_id) в групповом репо и получить от него пользователей.Это теоретически правильный способ его реализации.

- РЕДАКТИРОВАТЬ - Для вашего комментария:

Да, я согласен, что из чистого БД POV его более эффективным.

Но вы не сможете сделать это без встроенного запроса, так как DQL, построитель запросов и все, что связано с доктриной, использует Entities для выполнения действий, и, поскольку вы используете ORM по своему замыслу, у вас не будетсущность для таблиц соединения.

В противном случае единственный способ - изменить отображение с a many to many relation from user to groups using join table на a one-to-many from users to user_groups and a many-to-one from user_groups to groups.Таким образом, у вас будет сущность для user_groups.

Тогда вы сможете напрямую использовать эту сущность для получения пользователей.

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

0 голосов
/ 25 октября 2011

Вот ваш запрос в DQL:

$query = $em->createQuery('SELECT u.id, u.name FROM Path\To\Users u LEFT JOIN u.groups g WHERE g.id = :group');
$query->setParameter('group', $group);
$users = $query->getResult();

Я также склонен думать о таком запросе с точки зрения объединения таблиц, но Doctrine, кажется, имеет больше смысла, когда вы думаете об этом с точки зрения ассоциаций и коллекций объектов, которые содержит ваша сущность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...