如何更新学说中的字段以将其设置为空


How to update a field in doctrine to set it null

我想在条令中为字段设置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)