2017-12-20 6 views
-1

현재 Symfony3.4를 사용하는 프로젝트에서 프로젝트를 진행하고 있습니다. 프로젝트는 호텔의 객실 예약에 관한 것입니다.
두 엔티티 room(id,...)bookings(room,check_in,check_out,...)이 있고 그 사이의 관계는 OneToMany입니다.
check_incheck_out 필드로 예약되지 않은 객실을 검색하려고합니다.
내가 컨트롤러에서이 함수를 호출 할 때 RoomRepository에서 함수가잘못된 PathExpression은 StateFieldPathExpression이어야합니다

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

findRoomsNotBookedByCheckInCheckOut라고했다

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.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 

.
나는 b.roomb에와 함수가 될 수를 변경하여 해결하기 위해 다시 시도 :

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); 
관련 문제