教义 - 不在
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();
}
希望对您有所帮助
我正在为我的大学制作一个汽车预订应用程序 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();
}
希望对您有所帮助