Я предлагаю добавить промежуточную сущность UserParking между сущностью User и Parking.
Таким образом, у нас есть отношение OneToMany между User и UserParking и отношение OneToMany между Parking и UserParking вместо отношения ManyToMany между User и Parking.
Объекты будут похожи на код ниже:
Пользователь сущности:
<?php
/**
* @ORM\Entity
* @UniqueEntity(fields="username", message="Username already taken")
*/
class User implements UserInterface
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
public function getId()
{
return $this->id;
}
/**
* @ORM\Column(type="string", length=191, unique=true)
* @Assert\NotBlank()
*/
private $username;
/**
* @ORM\OneToMany(targetEntity="App\Entity\UserParking", mappedBy="agent")
* @ORM\JoinColumn(nullable=true)
*/
private $user_parking;
// getter and setter
}
Entity Parking:
<?php
/**
* @ORM\Entity(repositoryClass="App\Repository\ParkingRepository")
*/
class Parking
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=55)
*/
private $libelle;
/**
* @ORM\OneToMany(targetEntity="App\Entity\UserParking", mappedBy="parking")
* @ORM\JoinColumn(nullable=true)
*/
private $user_parking;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Voiture", mappedBy="parking", orphanRemoval=true)
*/
private $voitures;
// getters and setters
}
Entity UserParking
/**
* UserParking
*
* @ORM\Table(name="user_parking")
* @ORM\Entity(repositoryClass="App\Repository\UserParkingRepository")
*/
class UserParking
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="user_parking")
* @ORM\JoinColumn(nullable=false)
*/
private $agent;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Parking", inversedBy="user_parking")
* @ORM\JoinColumn(nullable=false)
*/
private $parking;
// getter and setter
}
И Entity Voiture
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity(repositoryClass="App\Repository\VoitureRepository")
*/
class Voiture
{
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=200)
*/
private $matricule;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Parking", inversedBy="voitures")
* @ORM\JoinColumn(nullable=false)
*/
private $parking;
/**
* @ORM\Column(type="boolean")
*/
private $parked;
}
Таким образом, чтобы получить автомобили (голоса), которые принадлежат всем парковкам, к которым относится текущий пользователь, необходимо:
1 - Получить текущий объект пользователя.
2 - Получить массив UserParking от объекта пользователя.
3- Получить объекты парковки из массива UserParking.
4- Получить машины с парковочных объектов.
Код будет похож на этот:
$em = $this->getDoctrine()->getManager();
/* Get user from the session */
$user = $this->getUser();
$userParkings = $user->getUserParking();
$parkings = [];
foreach ($userParkings as $item) {
$parking = $item->getParking();
$parkings[count($parkings)] = $parking;
}
// you can get voitures from parkings