教义 - 不在

Doctrine - not In

我正在为我的大学制作一个汽车预订应用程序 class。我在数据库中存储了预订,我想查询在给定时间段内可用的汽车。

因此,我创建了如下所示的自定义存储库 class:

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 returns 在给定时间段内发生的预订数组,$query 应该 return 只有可用的汽车。

在预订中 table 我有 field/column 命名为 car_id(在预订实体中它是 $carId)。

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

我想应该是这样的:

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

您只能使用您不能在 se 主查询中 select 的汽车 ID 来创建子select。

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

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

希望对您有所帮助