在我的应用中,我有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;
鉴于用户的电子邮件,我可以得到这样的房间ID:
$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();
但是,这似乎很漫长。是否可以优化此设置并查询房间而无需拨打两个数据库?
答案 0 :(得分:3)
是的,您可以直接从$user
变量中获取它。我没有在此处列出任何获取器或设置器,但我假设您已创建它们。如果是这样,那么您可以执行以下操作:
$bookings = $user->getBookings();
预订是一个数组,因此您需要选择要为其预订房间的预订。让我们选择第一个:
$roomId = $bookings->first()->getRoom()->getId()
要使其更加整洁,您可以添加getCurrentBooking
方法或类似于User
类的方法,这些方法将返回您想要的确切预订。
然后,您将得到类似以下的内容:
$roomId = $user->getCurrentBooking->getRoom()->getId()