Symfony关系

时间:2018-09-11 23:04:34

标签: symfony doctrine-orm

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

但是,这似乎很漫长。是否可以优化此设置并查询房间而无需拨打两个数据库?

1 个答案:

答案 0 :(得分:3)

是的,您可以直接从$user变量中获取它。我没有在此处列出任何获取器或设置器,但我假设您已创建它们。如果是这样,那么您可以执行以下操作:

$bookings = $user->getBookings();

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

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

要使其更加整洁,您可以添加getCurrentBooking方法或类似于User类的方法,这些方法将返回您想要的确切预订。

然后,您将得到类似以下的内容:

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