Последний час или около того я пытаюсь получить MySQL-запрос ниже, работающий в DQL, но вместо того, чтобы возвращать ожидаемый результат, он ничего не выводит.
Это запрос MySQL, который выводит правильный результат.
MySQL:
SELECT vp.id FROM vehicle_photo AS vp
INNER JOIN vehicle AS v ON vp.vehicle_id = v.id AND vp.manualMaintenanceCheckedOn IS NULL AND vp.type_id = 1
LEFT JOIN vehicle_maintenance_history AS vmh ON vmh.vehicle_id = v.id AND vmh.source != 'kip' AND vmh.source != 'haan'
WHERE vmh.vehicle_id IS NULL
LIMIT 1;
DQL:
$qb = $this->getDoctrine()->getEntityManager()->createQueryBuilder();
$qb->select('vp.id')
->from('VaartlandIntranetBundle:VehiclePhoto', 'vp')
->innerJoin('vp.vehicle', 'v')
->leftJoin('v.vehicleMaintenanceHistory', 'vmh', \Doctrine\ORM\Query\Expr\Join::WITH, 'vmh.vehicle = v.id')
->where('vp.type = 1')
->andWhere('vp.manualMaintenanceCheckedOn is null')
->andWhere('vmh.source != :kip')
->andWhere('vmh.source != :haan')
->andWhere('vmh.vehicle IS NULL')
->setParameter('kip','kip')
->setParameter('haan','haan')
->setMaxResults(1);
$ers = $qb->getQuery();
$res = $qb->getQuery()->getResult();
Насколько нам известно, что-то не так с vmh.source. Когда вы оставляете "andWhere (" vmh.source! =: Haan ")" и "andWhere" ("vmh.source! =: Kip"), "запрос DQL выводит результаты. Однако эти фильтры должны быть активны, так как оба должны быть отфильтрованы.
Надеюсь, вы, ребята, знаете, как исправить результирующий набор.
ИМХО ваш исходный SQL отличается от того, который был создан Doctrine. Я бы попробовал что-то вроде этого:
$qb = $this->getDoctrine()->getEntityManager()->createQueryBuilder();
$qb->select('vp.id')
->from('VaartlandIntranetBundle:VehiclePhoto', 'vp')
->innerJoin('vp.vehicle', 'v')
->leftJoin(
'v.vehicleMaintenanceHistory',
'vmh',
\Doctrine\ORM\Query\Expr\Join::WITH,
$qb->expr()->andx(
$qb->expr()->eq('vmh.vehicle', 'v.id'),
$qb->expr()->neq('vmh.source', ':kip'),
$qb->expr()->neq('vmh.source', ':haan')
)
)
->where('vp.type = 1')
->andWhere('vp.manualMaintenanceCheckedOn is null')
->andWhere('vmh.vehicle IS NULL')
->setParameter('kip', 'kip')
->setParameter('haan', 'haan')
->setMaxResults(1);
$ers = $qb->getQuery();
$res = $qb->getQuery()->getResult();
Если динамические параметры haan
и kip
всегда будут установлены на kip
и haan
я бы пропустил назначение и записал их непосредственно в выражении.
Больше информации: