symfony - 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 次数据库调用?
解决方案
是的,您可以直接从$user
变量中获取它。我没有看到这里列出的任何 getter 或 setter,但我假设您已经创建了它们。如果是这样,那么您可以执行以下操作:
$bookings = $user->getBookings();
Bookings 是一个数组,因此您需要选择要获得房间的预订。让我们选择第一个:
$roomId = $bookings->first()->getRoom()->getId()
为了使它更干净,您可以添加一个getCurrentBooking
方法或类似于您的User
类的东西,它将返回您想要的确切预订。
然后你会得到这样的结果:
$roomId = $user->getCurrentBooking->getRoom()->getId()
推荐阅读
- git - 预提交挂钩检查源 lint(未暂存)
- python-3.x - 匹配括号中模式的多个实例
- c++ - 在 C++ 中解析 JSON 消息
- java - RecyclerView 在特定 Activity 的片段之间切换后消失
- python - 将 Pandas 行中的数据拆分到新列
- javascript - 将嵌套对象 JavaScript 中的键值相乘
- javascript - 在 selenium-java 中模拟输入类型“日期”的 onchange(自动日期选择器)
- javascript - 使用 node.js mysql 查询解决未定义的承诺
- python - 如何检查一组数字是否包含在更大的数字范围内?
- c - 如何从我的代码中删除“不兼容的指针类型”警告?