gpt4 book ai didi

php - 内部联接如何使用 Doctrine 和 Symfony2 处理多对多关系

转载 作者:IT王子 更新时间:2023-10-28 23:49:35 25 4
gpt4 key购买 nike

我最近解决了查询ManyToMany 关系连接表的问题,解决方案与此相同answer并想知道它是如何工作的。假设我在 groupsteam 之间有一个简单的 ManyToMany 关系,将有一个 groups_team 表会自动在这里创建

团体实体

/**
* Groups
*
* @ORM\Table(name="groups")
* @ORM\Entity(repositoryClass="AppBundle\Model\Repository\GroupsRepository")
*/
class Groups {

/**
* @ORM\ManyToMany(targetEntity="Team", inversedBy="group")
*/
protected $team;

public function __construct() {
$this->team = new ArrayCollection();
}

/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string
*
* @ORM\Column(name="groupname", type="string", length=255)
*/
private $groupname;
//obligatory getters and setters :)

团队实体

/**
* Team
*
* @ORM\Table(name="team")
* @ORM\Entity(repositoryClass="AppBundle\Model\Repository\TeamRepository")
*/
class Team {

/**
* @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
*/
protected $group;

public function __construct(){
$this->group = new ArrayCollection();
}

/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;

/**
* @var string
*
* @ORM\Column(name="teamname", type="string", length=255)
*/
private $team;
//[setters and getters here]

为了让所有团队都在一个组中,我必须查询 groups_team 表。我会直接在 mysql 中查询该表,但在 symfony 中我必须这样做

      $groups = $em->getRepository("AppBundle\Model\Entity\Groups")->findBy(array('tournament' => $tournament->getId()));

//get all teams with group id in groups_team table
foreach ($groups as $group) {
$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")->createQueryBuilder('o')
->innerJoin('o.group', 't')
->where('t.id = :group_id')
->setParameter('group_id', $group->getId())
->getQuery()->getResult();
echo "</b>".$group->getGroupname()."</b></br>";
foreach ($teamsingroup as $teamingroup) {
echo $teamingroup->getTeam()."</br>";
}
}

有人可以向我解释一下 innerJoin 是如何工作的,这背后的概念是什么,也许可以通过一些文档来了解这一点。有没有更好的方法用 symfony 和 doctrine 来做到这一点。

最佳答案

在 2 个实体之间使用 ManyToMany 涉及到第三个表,通常在这种类型的关系中称为联结表,当您构建 DQL( Doctrine 查询) Doctrine 时,会根据关系的性质自动连接联结表您已将其定义为注释,因此请考虑您的查询

$teamsingroup = $em->getRepository("AppBundle\Model\Entity\Team")
->createQueryBuilder('o')
->innerJoin('o.group', 't')

您将在 innerJoin('o.group') 部分 o 中加入 Team 实体和 Group 实体是 Team 实体的别名,o.group 指的是在名为 groupTeam 实体中定义的属性。

/**
* @ORM\ManyToMany(targetEntity="Groups", mappedBy="team")
*/
protected $group;

为这种类型的关系 Doctrine 定义了一个 ManyToMany 注释首先将您的团队表与联结表连接起来,然后将您的联结表与组表连接起来,生成的 SQL 将类似于

SELECT t.*
FROM teams t
INNER JOIN junction_table jt ON(t.id = jt.team_id)
INNER JOIN groups g ON(g.id = jt.group_id)
WHERE g.id = @group_id

另一件事与您为每个组获取团队的方式有关,一旦您将团队属性定义为 ArrayCollection$this->team = new ArrayCollection(); 在每个组对象上,您将通过在组对象上调用 getTeam() 函数获得与该特定组关联的团队集合,类似于下面的代码。

foreach ($groups as $group) {
$teamsingroup = $group->getTeam();
echo "</b>".$group->getGroupname()."</b></br>";
foreach ($teamsingroup as $teamingroup) {
echo $teamingroup->getTeam()."</br>";
}
}

关于php - 内部联接如何使用 Doctrine 和 Symfony2 处理多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34874485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com