我目前正在使用Symfony3.4开展一个项目,一个项目是关于预订酒店的房间
我有两个实体room(id,...)
和bookings(room,check_in,check_out,...)
,它们之间的关系是OneToMany
我正在尝试检索未在check_in
和check_out
字段中预订的房间
我在名为RoomRepository
findRoomsNotBookedByCheckInCheckOut
中执行了一项功能
public function findRoomsNotBookedByCheckInCheckOut(Request $request) {
$em = $this->getEntityManager();
$q = $em->createQuery("SELECT r FROM AppBundle:Room r "
. "WHERE r NOT IN ( "
. "SELECT b.room FROM AppBundle:Bookings b "
. "WHERE NOT ( "
. "b.checkOut <= :checkIn "
. "OR b.checkIn >= :checkOut "
. ") "
. ") ORDER BY r.id")
->setParameter('checkIn', "'".$request->query->get('check-out')."'")
->setParameter('checkOut', "'".$request->query->get('check-in')."'");
die($q->getSQL());
return $q->getResult();
}
当我从控制器调用此功能时
private function roomsByCheckInCheckOut(Request $request, $em) {
if ($request->query->get('check-in') != null && $request->query->get('check-out') != null) {
$rooms = $em->getRepository('AppBundle:Room')->findRoomsNotBookedByCheckInCheckOut($request);
}
return null;
}
我收到的错误是:
[Semantical Error] line 0, col 57 near 'room FROM AppBundle:Bookings': Error: Invalid PathExpression. Must be a StateFieldPathExpression.
我尝试通过将b.room
更改为b.room.id
:
public function findRoomsNotBookedByCheckInCheckOut(Request $request) {
$em = $this->getEntityManager();
$q = $em->createQuery("SELECT r FROM AppBundle:Room r "
. "WHERE r NOT IN ( "
. "SELECT b.room.id FROM AppBundle:Bookings b "
. "WHERE NOT ( "
. "b.checkOut <= :checkIn "
. "OR b.checkIn >= :checkOut "
. ") "
. ") ORDER BY r.id")
->setParameter('checkIn', "'".$request->query->get('check-out')."'")
->setParameter('checkOut', "'".$request->query->get('check-in')."'");
die($q->getSQL());
return $q->getResult();
}
我得到另一个错误:
[Semantical Error] line 0, col 62 near 'id FROM AppBundle:Bookings': Error: Class AppBundle\Entity\Bookings has no field or association named room.id
这是逻辑,因为实体bookings
没有room.id
,但它有room
。
我通过将b.room
更改为b
并且函数变为:
public function findRoomsNotBookedByCheckInCheckOut(Request $request) {
$em = $this->getEntityManager();
$q = $em->createQuery("SELECT r FROM AppBundle:Room r "
. "WHERE r NOT IN ( "
. "SELECT b FROM AppBundle:Bookings b "
. "WHERE NOT ( "
. "b.checkOut <= :checkIn "
. "OR b.checkIn >= :checkOut "
. ") "
. ") ORDER BY r.id")
->setParameter('checkIn', "'".$request->query->get('check-out')."'")
->setParameter('checkOut', "'".$request->query->get('check-in')."'");
die($q->getSQL());
return $q->getResult();
}
它运行正常,没有任何错误,但它没有找到正确的结果 注意:我在MySQL数据库中测试了sql查询,得到了正确的结果
答案 0 :(得分:1)
我刚刚添加IDENTITY(b.room)
解决了我的问题。
$q = $em->createQuery("SELECT r.id FROM AppBundle:Room r "
. "WHERE r.id NOT IN ( "
. "SELECT IDENTITY(b.room) FROM AppBundle:Bookings b "
. "WHERE NOT ( "
. "b.checkOut < :checkIn "
. "OR b.checkIn > :checkOut "
. ") "
. ") ORDER BY r.id")
->setParameter('checkIn', $chIn)
->setParameter('checkOut', $chOut);