使用查询生成器和 Symfony 的预订系统
Booking system using query builder and Symfony
我正在尝试使用 Symfony 4 构建类似 airbnb 的应用程序。我有用户列出的属性以及对这些属性的预订。这些实体之间的关系是 OneToMany。一个 属性 到许多保留。每个预订都有一个 start_date 和一个 end_date。我想 运行 查询 returns 用户选择的特定日期未使用的所有属性。到目前为止,我的查询是这样的:
->andWhere('NOT (reservations.startDate BETWEEN :checkInDate AND :checkOutDate) AND ' .
'NOT (reservations.endDate BETWEEN :checkInDate AND :checkOutDate) AND ' .
'NOT (reservations.startDate <= :checkInDate AND reservations.endDate >= :checkOutDate)')
->setParameter('checkInDate', new \DateTime($checkIn))
->setParameter('checkOutDate', new \DateTime($checkOut))
->innerJoin('p.reservations', 'reservations');
然而,这似乎只检查每个 属性 数据库中显示的第一个预订,而忽略其余部分。我如何编写代码,以便查询检查为 属性 所做的所有保留,而不仅仅是数据库中的第一个。非常感谢
我明白了。我为不与用户选择的日期重叠的预订创建了另一个查询,然后在 属性 查询中使用 notIn 来获取没有此类预订的所有属性。这是代码。这是预订查询:
$subQueryBuilder = $this->getEntityManager()->createQueryBuilder();
$subQuery = $subQueryBuilder
->select('prop.id')
->from('App:Reservation', 'reservation')
->orWhere('reservation.startDate BETWEEN :checkInDate AND :checkOutDate')
->orWhere('reservation.endDate BETWEEN :checkInDate AND :checkOutDate')
->orWhere('reservation.startDate <= :checkInDate AND reservation.endDate >= :checkOutDate')
->andWhere('reservation.confirmedAt IS NOT NULL')
->andWhere('reservation.rating IS NULL')
->innerJoin('reservation.property', 'prop')
;
这是对属性的查询,returns 只有在第一个查询中找不到的属性。它使用 属性 id 来检查。
$properties = $this->createQueryBuilder('p')
->select('p')
->andWhere('p.approved = 1')
->andWhere($properties->expr()->notIn('p.id', $subQuery->getDQL()))
->andWhere('reservations.confirmedAt IS NOT NULL')
->andWhere('reservations.rating IS NULL')
->setParameter('checkInDate', new \DateTime($checkIn))
->setParameter('checkOutDate', new \DateTime($checkOut))
->innerJoin('p.reservations', 'reservations')
->getQuery();
我正在尝试使用 Symfony 4 构建类似 airbnb 的应用程序。我有用户列出的属性以及对这些属性的预订。这些实体之间的关系是 OneToMany。一个 属性 到许多保留。每个预订都有一个 start_date 和一个 end_date。我想 运行 查询 returns 用户选择的特定日期未使用的所有属性。到目前为止,我的查询是这样的:
->andWhere('NOT (reservations.startDate BETWEEN :checkInDate AND :checkOutDate) AND ' .
'NOT (reservations.endDate BETWEEN :checkInDate AND :checkOutDate) AND ' .
'NOT (reservations.startDate <= :checkInDate AND reservations.endDate >= :checkOutDate)')
->setParameter('checkInDate', new \DateTime($checkIn))
->setParameter('checkOutDate', new \DateTime($checkOut))
->innerJoin('p.reservations', 'reservations');
然而,这似乎只检查每个 属性 数据库中显示的第一个预订,而忽略其余部分。我如何编写代码,以便查询检查为 属性 所做的所有保留,而不仅仅是数据库中的第一个。非常感谢
我明白了。我为不与用户选择的日期重叠的预订创建了另一个查询,然后在 属性 查询中使用 notIn 来获取没有此类预订的所有属性。这是代码。这是预订查询:
$subQueryBuilder = $this->getEntityManager()->createQueryBuilder();
$subQuery = $subQueryBuilder
->select('prop.id')
->from('App:Reservation', 'reservation')
->orWhere('reservation.startDate BETWEEN :checkInDate AND :checkOutDate')
->orWhere('reservation.endDate BETWEEN :checkInDate AND :checkOutDate')
->orWhere('reservation.startDate <= :checkInDate AND reservation.endDate >= :checkOutDate')
->andWhere('reservation.confirmedAt IS NOT NULL')
->andWhere('reservation.rating IS NULL')
->innerJoin('reservation.property', 'prop')
;
这是对属性的查询,returns 只有在第一个查询中找不到的属性。它使用 属性 id 来检查。
$properties = $this->createQueryBuilder('p')
->select('p')
->andWhere('p.approved = 1')
->andWhere($properties->expr()->notIn('p.id', $subQuery->getDQL()))
->andWhere('reservations.confirmedAt IS NOT NULL')
->andWhere('reservations.rating IS NULL')
->setParameter('checkInDate', new \DateTime($checkIn))
->setParameter('checkOutDate', new \DateTime($checkOut))
->innerJoin('p.reservations', 'reservations')
->getQuery();