gpt4 book ai didi

php - 3 个表之间的 Symfony Doctrine 关系

转载 作者:行者123 更新时间:2023-11-29 05:58:09 25 4
gpt4 key购买 nike

我是 Symfony 的新手。我正在使用版本 3。我简化了示例。我有 3 个表,为此我为每个表创建了一个类。

表“人物”:id |姓名表“组”:id |团队名字表“人员组”:id |人 |组

每个人都可以在几个组中,每个组可以有几个人。在表 PersonGroup 中,我将人员与组联系起来。在我的 Controller 中,我想请求所选人员属于哪个组。但在转储中,我只有 PersonGroup 表中的数据,而不是组的详细信息(在本例中为名称):

PersonGroup {#485 ▼
-id: 5
-person: Person {#456 ▼
-id: 4
-name: "Adam"
-personGroups: PersistentCollection {#445 ▶}
}
-group: Group {#486 ▼
+__isInitialized__: false
-id: 5
-name: null
-personGroups: null
…2
}
}

我的 Controller :

/**
* @Route("/person/{personId}", name="personController")
*/
public function showAction($personId)
{
$em = $this->getDoctrine()->getManager();
$item = $em->getRepository('AppBundle:Person')
->findOneBy(['id' => $personId]);

foreach ($person->getPersonGroup() as $personGroup) {
dump($personGroup);
}

return $this->render('person/detail.html.twig', [
'person' => $person
]);
}

人类/实体:

class Person
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\Column(type="string")
*/
private $name;

/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\PersonGroup", mappedBy="person")
*/
private $personGroups;

/**
* Item constructor.
*/
public function __construct()
{
$this->personGroups= new ArrayCollection();
}

/**
* @return mixed
*/
public function getId()
{
return $this->id;
}

/**
* @param mixed $id
*/
public function setId($id)
{
$this->id = $id;
}

/**
* @return mixed
*/
public function getName()
{
return $this->name;
}

/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}

/**
* @return ArrayCollection*
*/
public function getPersonGroups()
{
return $this->personGroups;
}
}

组类/实体:

class Group
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\Column(type="string")
*/
private $name;

/**
* @ORM\OneToMany(targetEntity="AppBundle\Entity\PersonGroup", mappedBy="group")
*/
private $personGroups;

/**
* Item constructor.
*/
public function __construct()
{
$this->personGroups= new ArrayCollection();
}

/**
* @return mixed
*/
public function getId()
{
return $this->id;
}

/**
* @param mixed $id
*/
public function setId($id)
{
$this->id = $id;
}

/**
* @return mixed
*/
public function getName()
{
return $this->name;
}

/**
* @param mixed $name
*/
public function setName($name)
{
$this->name = $name;
}

/**
* @return ArrayCollection*
*/
public function getPersonGroups()
{
return $this->personGroups;
}
}

PersonGroup 类/实体:

class PersonGroup 
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Person", inversedBy="group")
* @ORM\JoinColumn(nullable=false)
*/
private $person;

/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Group", inversedBy="person")
* @ORM\JoinColumn(nullable=false)
*/
private $group;

/**
* @return mixed
*/
public function getId()
{
return $this->id;
}

/**
* @param mixed $id
*/
public function setId($id)
{
$this->id = $id;
}

/**
* @return Person
*/
public function getPerson()
{
return $this->person;
}

/**
* @param Person $person
*/
public function setPerson(Person $person)
{
$this->person = $person;
}

/**
* @return Group
*/
public function getGroup()
{
return $this->group;
}

/**
* @param Group $group
*/
public function setGroup(Group $group)
{
$this->group = $group;
}
}

最佳答案

您可以从 PersonGroup 访问您的 Group 实体

/**
* @Route("/person/{personId}", name="personController")
*/
public function showAction($personId)
{
$em = $this->getDoctrine()->getManager();
$item = $em->getRepository('AppBundle:Person')
->findOneBy(['id' => $personId]);

foreach ($person->getPersonGroup() as $personGroup) {
dump($personGroup->getGroup());
}

return $this->render('person/detail.html.twig', [
'person' => $person
]);
}

但是您应该在组存储库和个人存储库中创建一个自定义函数来检索正确的实体。

编辑

  1. 如果您想要检索所有组实体,您应该为您的关系添加一个参数 fetch="EAGER",它会自动对您的关系执行 innerJoin。
class PersonGroup 
{
/**
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @ORM\Column(type="integer")
*/
private $id;

/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Person", inversedBy="group", fetch="EAGER")
* @ORM\JoinColumn(nullable=false)
*/
private $person;

/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Group", inversedBy="person", fetch="EAGER")
* @ORM\JoinColumn(nullable=false)
*/
private $group;
  1. 例如,如果您想从某个人那里获取所有群组,您可以执行自定义存储库功能。

例如:

<?php

namespace AppBundle\Repository;

use AppBundle\Entity\Person;

/**
* GroupRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class GroupRepository extends \Doctrine\ORM\EntityRepository
{
public function findByPerson(Person $person){
return $this->createQueryBuilder('g')
->leftJoin('g.personGroups', 'pg')
->leftJoin('pg.person', 'p')
->where('p.id = :personId')
->setParameter('personId', $person->getId())
->getQuery()->getResult();

}
}

关于php - 3 个表之间的 Symfony Doctrine 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47458446/

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