私は現在、Symfony3.4を使用しているプロジェクトで作業しています。プロジェクトはホテルの客室を予約することです。
私は2つのエンティティroom(id,...)
とbookings(room,check_in,check_out,...)
を持ち、それらの間の関係はOneToMany
です。
check_in
とcheck_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.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();
}
と私は別のエラーを取得:エンティティbookings
はroom.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
にb.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)
を追加することによって、私の問題を解決し、右結果
昨日同じ質問をしましたか? ([こちらをご覧ください](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
@ReynierPMとても悪かったとしても、あなたの貢献に感謝します。あなたが私の投稿が好きではない場合は、再度投稿しないでください。 – Mostafa
あなたは同じことを何度も投稿する前にSOを正しく使う方法を読んで学ぶべきです。とにかく私たちがあなたの仕事をやり遂げることを期待してはいけません。あなたが私の前の答え(ちょうど昨日)を見て、これは私が自分の答えの解決策として投稿したものです。 – ReynierPM