2017-12-20 43 views
-1

私は現在、Symfony3.4を使用しているプロジェクトで作業しています。プロジェクトはホテルの客室を予約することです。
私は2つのエンティティroom(id,...)bookings(room,check_in,check_out,...)を持ち、それらの間の関係はOneToManyです。
check_incheck_outフィールドで予約されていない部屋を検索しようとしています。私は、固定しようとした無効なPathExpressionはStateFieldPathExpressionである必要があります

[Semantical Error] line 0, col 57 near 'room FROM AppBundle:Bookings': Error: Invalid PathExpression. Must be a StateFieldPathExpression. 

:私は私があるエラーを取得

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; 
    } 

コントローラからこの関数を呼び出すと、私は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(); 
    } 

呼ばRoomRepositoryで機能しなかった
b.roomb.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(); 
    } 

と私は別のエラーを取得:エンティティbookingsroom.idを持っていないため、ロジックですが、それはroomを持って

[Semantical Error] line 0, col 62 near 'id FROM AppBundle:Bookings': Error: Class AppBundle\Entity\Bookings has no field or association named room.id 

を。
私はbb.roomを変更することで解決するために、再度しようとした機能は次のようになります。

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クエリをテストし、私はちょうどIDENTITY(b.room)を追加することによって、私の問題を解決し、右結果

+0

昨日同じ質問をしましたか? ([こちらをご覧ください](https://stackoverflow.com/questions/47872448/invalid-pathexpression-must-be-a-statefieldpathexpression))。なぜ同じことをもう一度尋ねるのですか?私は[可能な解決策]を提供します(https://stackoverflow.com/questions/22666692/invalid-pathexpression-must-be-a-statefieldpathexpression-in-query-builder-wi)タイトルと読みやすさが異なる新しい答え。これを閉じて投票する! – ReynierPM

+0

@ReynierPMとても悪かったとしても、あなたの貢献に感謝します。あなたが私の投稿が好きではない場合は、再度投稿しないでください。 – Mostafa

+0

あなたは同じことを何度も投稿する前にSOを正しく使う方法を読んで学ぶべきです。とにかく私たちがあなたの仕事をやり遂げることを期待してはいけません。あなたが私の前の答え(ちょうど昨日)を見て、これは私が自分の答えの解決策として投稿したものです。 – ReynierPM

答えて

0

を取得します。

$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); 
関連する問題