我正在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自动忽略这种错误并返回一个空数组呢?
答案 0 :(得分:0)
我将使用手工制作的迁移脚本对其进行修复 保持代码不包含任何较早出现的错误的“变通办法”。
使用doctrine / migrations-bundle(如果尚未安装)。它使生活变得轻松。
然后使用bin/console mig:mig:gen
生成一个新的迁移类
并且可以使用纯SQL来修复这些值。 (在构建数组后重新序列化)
您甚至可以从迁移中访问容器。
答案 1 :(得分:0)
我不知道是否有更好的方法,但是对我来说,似乎您需要黑客才能克服这个问题。就您而言,我将使用$query->getArrayResult();
而不是$query->getResult();
将所有实体作为数组。然后找出哪些实体的数据字段格式错误,并通过querybuilder delete()
函数将其删除。
因此,您可以使您的代码再次工作,然后添加一些验证,这样就不会再次发生。