【问题标题】:Invalid PathExpression must be a StateFieldPathExpression [duplicate]无效的 PathExpression 必须是 StateFieldPathExpression [重复]
【发布时间】:2017-12-20 13:40:29
【问题描述】:

我目前正在做一个使用 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 查询,得到了正确的结果

【问题讨论】:

  • 你昨天不是问过同样的事情吗? (see here)。为什么你又问同样的问题?如果它不起作用,我会为您提供possible solution,然后创建一个具有不同标题和更好可读性的新答案。投票关闭!
  • @ReynierPM 感谢您的贡献,即使它非常糟糕。如果您不喜欢我的帖子,请不要再发帖。
  • 您应该阅读并学习如何正确使用 SO,然后再一次又一次地发布相同的内容,无论如何不要指望我们中的任何人做您的工作,您应该期望的是研究和学习 - 您没有不要经常练习。如果您查看我之前的答案(就在昨天),而这正是我在自己的答案中发布的解决方案。

标签: symfony doctrine-orm query-builder


【解决方案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);

【讨论】:

  • 嗨@Mostafa,您有关于使用IDENTITY() 的任何文档吗?...我遇到了和您一样的问题并解决了使用此功能...谢谢
猜你喜欢
  • 1970-01-01
  • 2012-12-22
  • 2014-02-01
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 2016-03-28
  • 2023-03-25
相关资源
最近更新 更多