首页 > 解决方案 > Symfony 关系

问题描述

在我的应用程序中,我有 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();

然而,这似乎是一个很长的路要走。是否可以优化这一点并查询房间而无需进行 2 次数据库调用?

标签: symfonydoctrine-orm

解决方案


是的,您可以直接从$user变量中获取它。我没有看到这里列出的任何 getter 或 setter,但我假设您已经创建了它们。如果是这样,那么您可以执行以下操作:

$bookings = $user->getBookings();

Bookings 是一个数组,因此您需要选择要获得房间的预订。让我们选择第一个:

$roomId = $bookings->first()->getRoom()->getId()

为了使它更干净,您可以添加一个getCurrentBooking方法或类似于您的User类的东西,它将返回您想要的确切预订。

然后你会得到这样的结果:

$roomId = $user->getCurrentBooking->getRoom()->getId()


推荐阅读