Reputation: 700
Context
I have a User entity which has one Team and Team which can have several users. I'm trying to fetch one team and to get the list of users associated with.
User Entity
<?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;
}
}
Team entity
<?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;
}
}
Doctrine version
2.5.14
The database
In my controller I succeed to get informations when going from user to the team
$user = $this->getDoctrine()->getRepository(User::class)->find(6);
dump($user);
$teamName = $user->getTeam()->getName();
dump($teamName);
But the contrary doesn't returns me the list of users
$team = $this->getDoctrine()->getRepository(Team::class)->find(1);
dump($team);
$users = $team->getUsers();
dump($users);
The output of this last part is:
So my question is why $users = $team1->getUsers();
doesn't return the list of users ?
Thanks
Upvotes: 0
Views: 1330
Reputation: 414
Probably for efficiency reasons, it seems that Symfony does not populate data until you request them.
Try this, you should see that the collection is not empty anymore, and that you can actually access the user data from a team:
$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);
Upvotes: 1