В моем приложении у меня есть 3 объекта; Пользователь, бронирование и номер.
субъект бронирования:
namespace App\Entity;
/**
* @ORM\Table(name="booking")
* @ORM\Entity(repositoryClass="App\Repository\BookingRepository")
*/
class Booking
{
/**
* @ORM\Column(type="boolean")
* @Assert\NotBlank()
*/
private $isActive;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\Room", inversedBy="bookings")
*/
private $room;
/**
* @ORM\ManyToOne(targetEntity="App\Entity\User", inversedBy="bookings")
*/
private $user;
Номер объекта:
/**
* @ORM\Table(name="room")
* @ORM\Entity(repositoryClass="App\Repository\RoomRepository")
*/
class Room
{
/**
* @ORM\OneToMany(targetEntity="App\Entity\Booking", mappedBy="room")
* @Expose
*/
private $bookings;
Пользователь:
/**
* @ORM\Table(name="app_user")
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @UniqueEntity(fields="email", message="This email address is already in use")
*/
class User implements AdvancedUserInterface
{
/**
* @ORM\Column(type="string", length=255, unique=true)
* @Assert\NotBlank()
* @Assert\Email()
*/
private $email;
/**
* @ORM\OneToMany(targetEntity="App\Entity\Booking", mappedBy="user")
* @Expose
*/
private $bookings;
Учитывая электронную почту пользователя, я могу получить номер комнаты, подобный этому:
$user = $this->getEntityManager()
->getRepository(User::class)
->findOneBy([
'email' => 'johndoe@domain.com'
]);
$booking = $this->getEntityManager()
->getRepository(Booking::class)
->findOneBy([
'user' => $user,
'isActive' => true,
]);
$roomId = $booking->getRoom()->getId();
Однако это, похоже, долгий путь. Можно ли оптимизировать это и запросить номер, не совершая двух вызовов базы данных?