如何忽略/捕获“转换数据库值错误”原则

时间:2018-09-21 10:25:25

标签: symfony doctrine-orm

我正在Doctrine项目中使用Symfony 2.8。实体之一使用数组字段:

/**
 * @ORM\Column(name="raw_data", type="array", nullable=true)
 */
protected $data;

由于存在错误,某些实体在此属性中而不是数组中存储了字符串:

$entity->setData('some string');
// ==> DB value: s:11:"some string";

坚持实体没有引起任何问题。但是,当尝试从DB Doctrine加载实体时会抛出错误:

  

无法将数据库值“ s:11:” some str ...“转换为Doctrine Type数组

这很有意义,因为该值不表示数组。

当然,我可以手动操作数据库,搜索所有不以a:....开头的值,然后修复或替换它们。

但是有没有办法告诉Doctrine自动忽略这种错误并返回一个空数组呢?

2 个答案:

答案 0 :(得分:0)

我将使用手工制作的迁移脚本对其进行修复 保持代码不包含任何较早出现的错误的“变通办法”。

使用doctrine / migrations-bundle(如果尚未安装)。它使生活变得轻松。

然后使用bin/console mig:mig:gen生成一个新的迁移类 并且可以使用纯SQL来修复这些值。 (在构建数组后重新序列化)

您甚至可以从迁移中访问容器。

答案 1 :(得分:0)

我不知道是否有更好的方法,但是对我来说,似乎您需要黑客才能克服这个问题。就您而言,我将使用$query->getArrayResult();而不是$query->getResult();将所有实体作为数组。然后找出哪些实体的数据字段格式错误,并通过querybuilder delete()函数将其删除。

因此,您可以使您的代码再次工作,然后添加一些验证,这样就不会再次发生。