Присоединяйтесь ко многим и многим отношениям Symfony4 с Doctrine - PullRequest
1 голос
/ 19 июня 2019

маленький вопрос о symfony и доктрине (я новичок в доктрине: b) Каков наилучший способ настроить запрос в доктрине, чтобы получить элементы таблицы, имеющие отношение «многие ко многим», только в том случае, если в промежуточной таблице есть поле? Я объясню лучше: У меня есть сущность X (пользователь) и сущность Y (навык), я хочу получить список сущностей Y, связанных хотя бы с одним элементом X, используя таблицу user_skill.

Так что, если у меня есть в дБ

user: id 1
skill: id 1 | id 2 | id 3
user_skill: id_user 1 id_skill 2 | id_user 1 id_skill 3,

я хочу получить такой же результат умения: 2 и 3.

Большое спасибо

Здесь код от моей сущности X (пользователь)

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\Skill")
 * @ORM\JoinTable(
 *  name="user_skill",
 *  joinColumns={@ORM\JoinColumn(name="skill_id", referencedColumnName="id")},
 *  inverseJoinColumns={@ORM\JoinColumn(name="skill_id", referencedColumnName="id")}
 * )
 */
 private $skills;

Вот запрос, который я хочу повторить в доктрине:

SELECT DISTINCT skill.id, skill.title FROM skill INNER JOIN user_skill ON skill.id = user_skill.skill_id 

1 Ответ

0 голосов
/ 19 июня 2019

Чтобы это работало, нужно исправить отношения.В пользовательском объекте удалите @ ORM / JoinTable, поскольку Doctrine делает это самостоятельно, и измените ManyToMany на:

@ORM\ManyToMany(targetEntity="App\Entity\Skill", inversedBy="users")

Затем добавьте это в навык:

/**
 * @ORM\ManyToMany(targetEntity="App\Entity\User", mappedBy="skills")
 */
private $users;

Теперь вы можете получить всенавыки, которыми пользуются все пользователи с:

$query = $this->em->createQueryBuilder()
    ->select('s')
    ->from('App:Skill', 's')
    ->join('s.user', 'u')
    ->andWhere('u.id != null');
$skillsUsedByAnyUsers = $query->getQuery()->getResult();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...