Как я могу выполнить findBy по отношению ко многим ко многим в Doctrine? - PullRequest
0 голосов
/ 11 марта 2020

У меня есть сущность, подобная приведенной ниже:

<?php
/** @Entity */
class User
{
    // ...

    /**
     * Many Users have Many Groups.
     * @ManyToMany(targetEntity="Group", inversedBy="users")
     * @JoinTable(name="users_groups")
     */
    private $groups;

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

    // ...
}

/** @Entity */
class Group
{
    // ...
    /**
     * Many Groups have Many Users.
     * @ManyToMany(targetEntity="User", mappedBy="groups")
     */
    private $users;

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

    // ...
}

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/association-mapping.html#many-to-many-двунаправленная

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

/** @var RelatedEntity $relatedEntity*/
$this->findBy('relatedObject'=>$relatedEntity);

Когда я пытаюсь выполнить его на объектах, показанных выше, вместо тщательного сбора объектов, скажем, user_group В таблице попробуйте найти столбец user_group внутри пользовательской таблицы. Он генерирует ошибку, например:

Исключительная ситуация при выполнении 'SELECT t0.id AS id_1, t0.created_at AS созданный_т_2, t0.updated_at AS обновленный_at_3, t0.title AS title_4, t0.text AS text_5 ОТ пользователя t0 ГДЕ user_group.group_id =? ' с параметрами ["8192ed63-5d07-4c99-8902-006a3aa986e7"]:

SQLSTATE [42P01]: неопределенная таблица: 7 ОШИБКА: отсутствует запись предложения FROM для таблицы "user_group"

Понятия не имею, как это сделать правильно. Что я пропустил?

1 Ответ

1 голос
/ 12 марта 2020

В случае ManyToMany вы можете создать свою функцию в репозитории и указать пользователя WHERE MEMBER OF, вот пример

->andWhere(':activity MEMBER OF t.activities')
->setParameter('activity', $data['activity'])
...