我想在条令中为字段设置null,这是句子
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder();
$query = $qb->update('Model'Example', 'u')->set('u.deletedAt', ':deletedAt')
->where("u.id IN (:ids)")->setParameter('deletedAt', null)
->setParameter('ids', $ids)
->getQuery();
$query->execute();
我认为这个代码应该完成任务,但我得到了这个异常
执行"UPDATE example SET deleted_at=?"时发生异常?WHERE(id IN(?))AND(example.deleted_at为NULL)'带参数[null,"5,6"]:SQLSTATE[22P02]:无效的文本表示形式:7错误:无输入值的整数:«5,6»
首先,为什么学说添加AND(example.deleted_at为NULL)是我做错了什么?
您的原始查询看起来应该可以工作。我复制并测试了:
$em = $this->getService('doctrine.orm.entity_manager');
$qb = $em->createQueryBuilder();
$qb->update('Cerad'Bundle'PersonBundle'Entity'Person','person');
$qb->set('person.verified',':verified');
$qb->setParameter('verified',null);
$qb->where('person.id IN (:ids)');
$qb->setParameter('ids',array(1,2,3));
echo $qb->getQuery()->getSql(); // UPDATE persons SET verified = ? WHERE id IN (?)
$qb->getQuery()->execute();
工作符合预期。
你确定你复制/粘贴了你的确切代码吗?事后不编辑?验证您的id数组是否真的是一个整数数组。这是我唯一能看到的可能存在问题的地方。并且一定要确保你的错误来自你发布的代码。也许发生了其他事情?尝试在命令对象中隔离代码。当然deletedAt是否可以为null设置为true?
在这种情况下,实际上没有必要使用expr对象。条令2正确处理IN语句的数组。
========================================
我怀疑你有$id='5,6'?尝试将其设置为:$ids=数组(5,6);尽管即使使用字符串,我也看不出它是如何扰乱查询的。
当你用PHP null脚本设置值时,它不被理解为教条,因为当转换到原生sql时,他不会用null值替换null值作为字符串,所以要解决这个问题,可以像一样将null值作为串串传递
$qb->set('q.deletedAt','NULL');
感谢@Cerad问题是我使用了StofDoctrineExtensionBundle中的软删除扩展,而该捆绑包正在添加软删除过滤器,所以我只是禁用了软删除过滤器。现在它按预期工作,发布了解决方案,非常感谢。
$em = $this->getDoctrine()->getManager();
$em->getFilters()->disable('softdeleteable'); // this was the problem when you use the soft delete extension you need to disable the filter if you want to reactivate deleted records
$qb = $em->createQueryBuilder();
$qb->update('Model'Example', 'q');
$qb->set('q.deletedAt',':deletedAt');
$qb->setParameter('deletedAt',null);
$qb->where("q.id IN (:ids)");
$qb->setParameter('ids', $ids);
问题是$ids是一个字符串。你可以制作:
$arrayOfIds = explode(",", $ids);
并且在您更新查询后:
->setParameter('ids', $arrayOfIds)