使用查询构建器和 Symfony 的预订系统

Posted

技术标签:

【中文标题】使用查询构建器和 Symfony 的预订系统【英文标题】:Booking system using query builder and Symfony 【发布时间】:2021-09-23 13:23:53 【问题描述】:

我正在尝试使用 Symfony 4 构建像 airbnb 这样的应用程序。我有用户列出的属性以及这些属性的预订。这些实体之间的关系是 OneToMany。一个属性到多个预订。每个预订都有一个 start_date 和一个 end_date。我想运行一个查询,该查询返回用户选择的某些日期未采用的所有属性。到目前为止,我的查询是这样的:

->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');

但是,这似乎只检查每个属性的数据库中显示的第一个预订,而忽略其余部分。如何编写代码,以便查询检查为属性所做的所有预订,而不仅仅是数据库中的第一个。非常感谢

【问题讨论】:

如果你想获取属性,你需要使用属性存储库,你可以使用groupby属性 我正在使用属性仓库。代码会是什么样子?可以举个例子吗? 你添加了 ->groupby('p') 语句吗? 我也认为是登录 (reservations .end_date > :checkInDate) AND (reservations.start_date 【参考方案1】:

我想通了。我为不与用户选择的日期重叠的预订创建了另一个查询,然后在属性查询中使用 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')
        ;

这是对属性的查询,它只返回在第一个查询中没有找到的属性。它使用属性 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 的预订系统的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 查询构建器和表名

我尝试使用 Symfony 创建自定义查询构建器

Symfony - 在学说查询构建器中使用 orWhere()

Symfony4如何使用查询构建器获取对象

如何使用 symfony 在教义查询构建器中选择表之间的特定连接?

在 Symfony Doctrine 查询构建器中使用 PostgreSQL NOT SIMILAR TO