Symfony Doctrine 3 表之间的关系

莱尔

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

表“人”:id | 名称表“组”:id | groupname 表“PersonGroup”:id | 人 | 团体

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

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
  }
}

我的控制器:

/**
 * @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
    ]);
}

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

编辑

  1. 如果你想检索所有的 Group 实体,你应该在你的关系中添加一个参数 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. 例如,如果您想从 Person 获取所有组,您可以执行自定义存储库功能。

前任:

<?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();

    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章