Выберите поля от многих ко многим отношениям между 3 таблицами в Doctrine и ZF2 с помощью построителя запросов

У меня есть пользовательский объект:

class User{
...

/**
* @var Module $modules
* @ORM\ManyToMany(targetEntity="Adm\Entity\Module", inversedBy="users", cascade={"persist"})
* @ORM\JoinTable(
*  name="user_module",
*  joinColumns={@ORM\JoinColumn(name="module_id", referencedColumnName="id")},
*  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}
* )
*/
protected $modules;

public function __construct() {
$this->modules = new \Doctrine\Common\Collections\ArrayCollection();
}
...
}

И модуль Entity:

class Module{
...
/**
* @ORM\ManyToMany(targetEntity="Adm\Entity\User", mappedBy="modules")
*/
protected $users;
...
}

У меня есть три таблицы: пользователь, модуль и user_module (отношение между пользователем и модулем, без дополнительных полей).
Я пытаюсь построить запрос, чтобы получить пользователя (для $ id) и связанные с ним модули, отношения которых находятся в таблице user_module. Вот что я сделал:

    public function getUser($id){
$qb = $this->getEm()->createQueryBuilder()
->select('u', 'm')
->from('Adm\Entity\User', 'u')
->join('u.modules', 'm')
->where('u.id = ?1')
->setParameter(1, $id)
->setMaxResults(1);
$result = $qb->getQuery()->getResult(\Doctrine\ORM\AbstractQuery::HYDRATE_ARRAY);
return $result;
}

Но не приносит связанные модули с пользователем, это только 1 результат из таблицы модулей, которая имеет тот же идентификатор, что и пользователь.
Пожалуйста, помогите мне построить этот запрос. Спасибо!

2

Решение

Я понял, что инвертирую оператор столбца соединения:

*  joinColumns={@ORM\JoinColumn(name="module_id", referencedColumnName="id")},
*  inverseJoinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}

Должно быть:

*  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
*  inverseJoinColumns={@ORM\JoinColumn(name="module_id", referencedColumnName="id")}

И еще, мне пришлось удалить это утверждение в моей функции, благодаря @Garry, чтобы указать мне:

->setMaxResults(1)

Сейчас все работает как положено.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]