【问题标题】:Doctrine - not In教义 - 不在
【发布时间】:2016-02-27 12:51:36
【问题描述】:

我正在为我的大学课程制作一个汽车预订应用程序。我已将预订存储在 db 中,我想查询在给定时间段内可用的汽车。

所以,我创建了如下所示的自定义存储库类:

use Doctrine\ORM\EntityRepository;

class CarRepository extends EntityRepository
{
    public function findAllAvailable($pickupDate, $returnDate)
    {
        $subQueryBuilder = $this->getEntityManager()->createQueryBuilder();
        $carsInOverlapingPeriod = $subQueryBuilder
            ->select('rv')
            ->from('AppBundle:Reservation', 'rv')
            ->where(':pickup_date < rv.returnDateTime AND :return_date > rv.pickupDateTime')
            ->setParameters(array(
                'pickup_date' => $pickupDate,
                'return_date' => $returnDate
            ))
            ->getQuery()
            ->getArrayResult()
        ;

        $queryBuilder = $this->getEntityManager()->createQueryBuilder();
        $query = $queryBuilder
            ->select(['car'])
            ->from('AppBundle:Car', 'car')
            ->where($queryBuilder->expr()->notIn('car.id', ':subQuery'))
            ->setParameter('subQuery', $carsInOverlapingPeriod)
            ->getQuery()
        ;

        return $query->getResult();
    }
}

$carsInOverlapingPeriod 返回给定时间段内发生的预订数组,$query 应该只返回可用的汽车。

在预订表中,我有名为 car_id 的字段/列(在预订实体中,它是 $carId)。

无法弄清楚如何在 $query 中构建“where”条件。

我猜它应该是这样的:

WHERE car.id NOT IN subquery WITH car.id = rv.car_id

【问题讨论】:

    标签: php symfony doctrine-orm doctrine dql


    【解决方案1】:

    您可以仅使用您在主查询中无法选择的汽车 id 进行子选择。

    您可以直接将结果 DQL 语句作为子查询(而不是执行它并放入 id 数组)如下:

    public function findAllAvailable($pickupDate, $returnDate)
    {
        $subQueryBuilder = $this->getEntityManager()->createQueryBuilder();
        $subQuery = $subQueryBuilder
            ->select('IDENTITY(rv.carId)')   // see above comment for further explanation about identity
            ->from('AppBundle:Reservation', 'rv')
            ->where(':pickup_date < rv.returnDateTime AND :return_date > rv.pickupDateTime')
            ->setParameters(array(
                'pickup_date' => $pickupDate,
                'return_date' => $returnDate
            ));
    
        $queryBuilder = $this->getEntityManager()->createQueryBuilder();
        $query = $queryBuilder
            ->select(['car'])
            ->from('AppBundle:Car', 'car')
            ->where($queryBuilder->expr()->notIn('car.id', $subQuery->getQuery()->getDQL() ) )
            ->getQuery()
        ;
    
        return $query->getResult();
    }
    

    希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-14
      • 2013-05-26
      • 2013-04-21
      • 1970-01-01
      • 2020-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多