Php 如何更新条令中的字段以将其设置为空

Php 如何更新条令中的字段以将其设置为空,php,symfony,doctrine-orm,doctrine,query-builder,Php,Symfony,Doctrine Orm,Doctrine,Query Builder,我想在条令中给一个字段设置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,下面是句子

$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=”时发生异常? 其中(id IN(?)和(example.deleted_at为NULL)带有参数 [null,“5,6”]:SQLSTATE[22P02]:无效的文本表示法:7错误: 不存在válida参数整数值:«5,6»


首先,为什么doctrine会添加该值,以及(example.deleted_at为NULL)我是否做错了什么?

问题在于您的$ids是一个字符串。您可以:

$arrayOfIds=explode(“,”,$id)

在更新查询之后:

->setParameter('ids', $arrayOfIds)

您的原始查询看起来应该可以工作。我复制并测试了以下内容:

    $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();
一切正常

您确定复制/粘贴了您的确切代码吗?事后不编辑?验证您的ids数组是否确实是一个整数数组。这是我能看到的唯一可能存在问题的地方。确保你的错误来自你发布的代码。也许发生了什么事?尝试在命令对象中隔离代码。当然deletedAt有它的可为null的设置为true吗

在这种情况下,实际上不需要使用expr对象。条令2正确处理IN语句的数组

====================================


我怀疑你有$ID='5,6'?尝试将其设置为:$ids=array(5,6);尽管有一个字符串,但我看不出它是如何打乱查询的。

谢谢@Cerad问题是我使用了StofOctrineExtensionsBundle的软删除扩展,捆绑包正在添加软删除筛选器,所以我只是禁用了软删除筛选器,现在它按预期工作,发布了解决方案,非常感谢

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

当您使用PHP null脚本设置值时,这对于原则来说是不可理解的,因为在转换为本机sql时,他不会将null替换为null值作为字符串,因此要解决此问题,请将null值作为字符串传递

$qb->set('q.deletedAt','NULL');

我尝试了你的解决方案@Anime,但doctrine仍在构建一个额外的查询看看
更新示例集deleted\u at=?其中(id IN('5','6')和(example.deleted_at为NULL)
我认为错误在于“$ids”变量,它似乎不是数组。。。