php - 学说 dql 没有返回 MySQL 所期望的结果

标签 php mysql doctrine-orm dql symfony-2.3

最后一个小时左右,我试图让下面的 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 生成的 SQL 不同。我会尝试这样的事情:

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

如果 haankip 动态参数始终设置为 kiphaan 我会跳过赋值并直接将它们写在表达式中。

更多信息:

关于php - 学说 dql 没有返回 MySQL 所期望的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50003159/

相关文章:

PHP检查变量是否为整数

mysql - 如何提高 MySQL 中的 Left Join 查询性能?

mysql - Python在mysql上的INSERT INTO中转义特殊字符

doctrine-orm - Doctrine 2 DBAL 只返回字符串数据类型

php - 在 Laravel 中获取 MySQL 中的最大值

php - 将路由组织成单独的文件,在 Slim 中无法正常工作

php - Twig "Unable to add function"

java - 如何将类对象转换为通用对象类型?

php - 将 Symfony 实体导出为 CSV

mysql - 在Doctrine和mySql中,如何查询没有日期的记录