Doctrine OneToMany关系什么都不返回

时间:2018-03-19 16:36:29

标签: symfony doctrine-orm

上下文

我有一个User实体,其中有一个Team和Team,可以拥有多个用户。 我试图获取一个团队并获取与之关联的用户列表。

用户实体

<?php

namespace Enterprise\PortailBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
 * User entity class
 *
 * @ORM\Table(name="user")
 * @ORM\Entity(repositoryClass="Enterprise\PortailBundle\Repository\TeamRepository")
 * @category Entity
 * @package Entity
 */
class User
{
    /*
     * Relationship Mapping Metadata
     */

    public function __toString()
    {
        return  $this->firstName . ' - ' . $this->lastName . ' - ' . $this->enterprise . ' - ' . $this->team;
    }

    /**
     * @ORM\ManyToOne(targetEntity="Team", inversedBy="users")
     * @ORM\JoinColumn(name="team_id", referencedColumnName="id")
     */
    private $team;
    /*
     * Autogenerated methods / variables
     */

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

    /**
     * @var string
     *
     * @Assert\Length(min=2, minMessage="Le prénom de l'utilisateur doit être supérieur à 2 caractères.")
     * @Assert\Length(max=32, maxMessage="Le prénom de l'utiisateur doit être inférieur à 32 caractères.")
     * @ORM\Column(name="firstName", type="string", length=32)
     */
    private $firstName;

    /**
     * @var string
     *
     * @Assert\Length(min=2, minMessage="Le nom de l'utilisateur doit être supérieur à 2 caractères.")
     * @Assert\Length(max=64, maxMessage="Le nom de l'utilisateur doit être inférieur à 64 caractères.")
     * @ORM\Column(name="lastName", type="string", length=64)
     */
    private $lastName;

    /**
     * @var string
     *
     * @Assert\Length(min=2, minMessage="Le nom de l'entreprise doit être supérieur à 2 caractères.")
     * @Assert\Length(max=64, maxMessage="Le nom de l'entreprise doit être inférieur à 64 caractères.")
     * @ORM\Column(name="enterprise", type="string", length=64)
     */
    private $enterprise;

    /**
     * @Assert\File(mimeTypes={ "image/jpeg", "image/jpg", "image/png" })
     * @ORM\Column(name="image", type="string")
     */
    private $image;

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

    /**
     * Set firstName
     *
     * @param string $firstName
     *
     * @return User
     */
    public function setFirstName($firstName)
    {
        $this->firstName = $firstName;

        return $this;
    }

    /**
     * Get firstName
     *
     * @return string
     */
    public function getFirstName()
    {
        return $this->firstName;
    }

    /**
     * Set lastName
     *
     * @param string $lastName
     *
     * @return User
     */
    public function setLastName($lastName)
    {
        $this->lastName = $lastName;

        return $this;
    }

    /**
     * Get lastName
     *
     * @return string
     */
    public function getLastName()
    {
        return $this->lastName;
    }

    /**
     * Set enterprise
     *
     * @param string $enterprise
     *
     * @return User
     */
    public function setEnterprise($enterprise)
    {
        $this->enterprise = $enterprise;

        return $this;
    }

    /**
     * Get enterprise
     *
     * @return string
     */
    public function getEnterprise()
    {
        return $this->enterprise;
    }

    /**
     * Set image
     *
     * @param string $image
     *
     * @return User
     */
    public function setImage($image)
    {
        $this->image = $image;

        return $this;
    }

    /**
     * Get image
     *
     * @return string
     */
    public function getImage()
    {
        return $this->image;
    }

    /**
     * Set team
     *
     * @param Team $team
     *
     * @return User
     */
    public function setTeam(Team $team)
    {
        $this->team = $team;

        return $this;
    }

    /**
     * Get team
     *
     * @return Team
     */
    public function getTeam()
    {
        return $this->team;
    }
}

团队实体

    <?php

    namespace Enterprise\PortailBundle\Entity;

    use Doctrine\Common\Collections\ArrayCollection;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\Validator\Constraints as Assert;

    /**
     * Team entity class
     *
     * @ORM\Table(name="team")
     * @ORM\Entity(repositoryClass="Enterprise\PortailBundle\Repository\TeamRepository")
     * @category Entity
     * @package Entity
     */
    class Team
    {
        public function __toString()
        {
            return  $this->name . ' - ' . $this->role;
        }

        /**
         * @ORM\OneToMany(targetEntity="User", mappedBy="team")
         */
        private $users;

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

        /*
         * Autogenerated methods / variables
         */

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

        /**
         * @var string
         *
         * @Assert\Length(min=2, minMessage="Le nom de l'équipe doit être supérieur à 2 caractères.")
         * @Assert\Length(max=64, maxMessage="Le nom de l'équipe doit être inférieur à 64 caractères.")
         * @ORM\Column(name="name", type="string", length=64)
         */
        private $name;

        /**
         * @var string
         *
         * @Assert\Length(min=2, minMessage="Le role de l'équipe doit être supérieur à 2 caractères.")
         * @Assert\Length(max=64, maxMessage="Le role de l'équipe doit être inférieur à 64 caractères.")
         * @ORM\Column(name="role", type="string", length=64)
         */
        private $role;

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

        /**
         * Set name
         *
         * @param string $name
         *
         * @return Team
         */
        public function setName($name)
        {
            $this->name = $name;

            return $this;
        }

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

        /**
         * Get users
         *
         * @return \Doctrine\Common\Collections\Collection
         */
        public function getUsers()
        {
            return $this->users;
        }

        /**
         * Set role
         *
         * @param string $role
         *
         * @return Team
         */
        public function setRole($role)
        {
            $this->role = $role;

            return $this;
        }

        /**
         * Get role
         *
         * @return string
         */
        public function getRole()
        {
            return $this->role;
  }
}

学说版

2.5.14

数据库

团队和用户表 enter image description here

在我的控制器中,我从用户到团队时成功获取信息

$user = $this->getDoctrine()->getRepository(User::class)->find(6);
dump($user);
$teamName = $user->getTeam()->getName();
dump($teamName);

但相反并没有给我返回用户列表

$team = $this->getDoctrine()->getRepository(Team::class)->find(1);
dump($team);
$users = $team->getUsers();
dump($users);

最后一部分的输出是: enter image description here

所以我的问题是为什么$users = $team1->getUsers();没有返回用户列表?

由于

2 个答案:

答案 0 :(得分:1)

可能出于效率原因,似乎Symfony在您请求数据之前不会填充数据。

试试这个,您应该看到该集合不再是空的,并且您实际上可以从团队中访问用户数据:

$team = $this->getDoctrine()->getRepository(Team::class)->find(1);
dump($team);
$users = $team->getUsers();
dump($users); // #collection: ArrayCollection is not empty anymore
$firstName = $users[0]->getFirstName();
dump($firstName);

答案 1 :(得分:0)

<div class="section-1">
  
</div>
<div class="section-2">
  <div class="col">
    <p>Lorem ipsum dolor, sit amet consectetur adipisicing elit. Harum voluptatem beatae quia facilis nobis, dolore quidem nostrum! Blanditiis eveniet dolor a, laudantium repudiandae rem commodi ea adipisci. Eius, obcaecati rerum.</p>
  </div>
  <div class="col col-img">
    <img src="http://via.placeholder.com/650x650" alt="">
  </div>
</div>

将团队中的用户保存为数组集合 你的关系是完美的 你有错误的业务逻辑