无效的PathExpression必须是StateFieldPathExpression

时间:2017-12-20 13:40:30

标签: symfony doctrine-orm query-builder

我目前正在使用Symfony3.4开展一个项目,一个项目是关于预订酒店的房间 我有两个实体room(id,...)bookings(room,check_in,check_out,...),它们之间的关系是OneToMany 我正在尝试检索未在check_incheck_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查询,得到了正确的结果

1 个答案:

答案 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);