加入Symfony4与Doctrine的多对多关系

时间:2019-06-18 21:42:33

标签: php mysql symfony doctrine

关于symfony和主义的小问题(我是主义的新手:b) 仅在中间表中存在字段的情况下,在学说中建立查询以获取与另一个表具有多对多关系的元素的最佳方法是什么? 我会更好地解释: 我有实体X(用户)和实体Y(技能),我想使用user_skill表获取链接到X的至少一个元素的实体Y的列表。

所以,如果我在数据库中

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 :(得分:0)

为此,您需要纠正关系。在用户实体中,将@ 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();