如何更新doctrine中的字段以将其设置为null

时间:2013-11-28 14:55:15

标签: php symfony doctrine-orm doctrine query-builder

我想将null设置为doctrine中的字段,这里是句子

$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示例SET deleted_at =?时发生异常?   WHERE(id IN(?))AND(example.deleted_at IS NULL)'与params   [null,“5,6”]:SQLSTATE [22P02]:无效的文本表示:7错误:   la sintaxis de entrada noesválidaparainteger:«5,6»

首先,为什么学说添加AND(example.deleted_at IS NULL)我做错了什么?

4 个答案:

答案 0 :(得分:6)

您的原始查询看起来应该有效。我复制并测试:

    $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数组确实是一个整数数组。这是我可以看到可能存在问题的唯一地点。并确保您的错误来自您发布的代码。也许其他事情正在发生?尝试在命令对象中隔离代码。当然,已删除它是否可以设置为真可空?

在这种情况下,没有必要使用expr对象。 Doctrine 2正确处理IN语句的数组。

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

我怀疑你有$ ids ='5,6'?尝试将其设置为:$ ids = array(5,6);虽然即使是字符串我也看不出它是如何弄乱查询的。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

问题是你的$ ids是一个字符串。你可以做:

$arrayOfIds = explode(",", $ids);

之后更新查询:

->setParameter('ids', $arrayOfIds)

答案 3 :(得分:0)

当您使用PHP null脚本设置该值时,这在学说上是无法理解的,因为在转换为本机sql时,他不会将null替换为null值作为string,因此要解决,将null值作为字符串传递给

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