【发布时间】:2017-12-20 13:40:29
【问题描述】:
我目前正在做一个使用 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 查询,得到了正确的结果
【问题讨论】:
-
你昨天不是问过同样的事情吗? (see here)。为什么你又问同样的问题?如果它不起作用,我会为您提供possible solution,然后创建一个具有不同标题和更好可读性的新答案。投票关闭!
-
@ReynierPM 感谢您的贡献,即使它非常糟糕。如果您不喜欢我的帖子,请不要再发帖。
-
您应该阅读并学习如何正确使用 SO,然后再一次又一次地发布相同的内容,无论如何不要指望我们中的任何人做您的工作,您应该期望的是研究和学习 - 您没有不要经常练习。如果您查看我之前的答案(就在昨天),而这正是我在自己的答案中发布的解决方案。
标签: symfony doctrine-orm query-builder