【问题标题】:Join in Many to Many relationship Symfony4 with Doctrine加入多对多关系 Symfony4 与 Doctrine
【发布时间】:2019-06-18 21:42:33
【问题描述】:

关于 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 

【问题讨论】:

  • 请务必注意,Doctrine 会自行创建中间表 user_skill - 您无需自己创建。教义理清了幕后的关系。使用查询构建器尝试在用户存储库中构建一个查询,为单个用户提取所有技能。连接可能如下所示:->join("u.skills", "s")。如果您碰壁了,请将您的尝试添加到您的问题中 - 为我们提供了所有可以使用的东西。
  • 嗨 Geo,我知道,我已经在 DB 上拥有了我的实体功能结构和我的表,我的问题是如何使用查询生成器在这种情况下检索技能,我做到了,但我已经使用带有查询->准备->执行的“残酷”查询,我想知道是否有其他方法可以做到这一点。我将尝试在用户存储库中做一些事情,我正在通过技能存储库测试该方法:) 对不起我的英语^^

标签: php mysql symfony doctrine


【解决方案1】:

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

【讨论】:

  • 非常感谢 Vyctorya,今天下午我会试试你的 sn-p ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-10
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多