Doctrine DQL не возвращает ожидаемый результат, где MySQL делает

0

Последний час или около того я пытаюсь получить 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 выводит результаты. Однако эти фильтры должны быть активны, так как оба должны быть отфильтрованы.

Надеюсь, вы, ребята, знаете, как исправить результирующий набор.

Теги:
dql
doctrine2
symfony-2.3

1 ответ

1
Лучший ответ

ИМХО ваш исходный 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 я бы пропустил назначение и записал их непосредственно в выражении.

Больше информации:

  • 0
    Это решает проблему. Проблема была действительно с объединением. Спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню