我在PostgreSQL数据库中使用Doctrine ORM的ArrayCollection
注意到一些奇怪的事情(在Symfony 3项目中使用它)。
带我的User
班级角色,以默认角色ROLE_USER
发起,且必须是array
类型。
class User implements UserInterface, Serializable
{
/**
* @var ArrayCollection
*
* @ORM\Column(name="roles", type="array")
*/
private $roles;
public function __construct()
{
$this->roles = new ArrayCollection();
$this->roles->add('ROLE_USER');
}
}
它存储在数据库中,如下所示。
O:43:"Doctrine\Common\Collections\ArrayCollection":1:{s:53:"
在尝试以Serialization
身份登录时,会出现User
错误,因为数据库中显然缺少部分ArrayCollection
。
在Google搜索解决方案后,我遇到了this Github issue。据我了解,这是一个错误,您无法在ArrayCollection
环境中使用PostgreSQL
。
未在@ORM\Column
标记中定义类型也没有帮助,它会将以下内容存储在数据库中,而Symfony
无法使用它来检索角色。 Doctrine\Common\Collections\ArrayCollection@000000002300d10300000000545301a6
使用simple_array
或json
作为类型并不会返回一个对象,因此两者都是禁止的
有没有人有解决方法或解决方案?我真的开始后悔从MySQL
切换到PostgreSQL
注意:代码在MySQL
中工作正常,我只是切换了数据库。
答案 0 :(得分:0)
我自己也有这个问题,我不确定为什么postgresql会截断序列化的字符串,即使字段被标记为文本。我的建议是你将列类型转换为json_array,因为postgresql有一个本机类型。否则,您也可以使用自定义类型
答案 1 :(得分:0)
您始终可以专门为ArrayCollection属性创建自己的映射类型。 Doctrine DBAL docs和ORM cookbook描述了如何创建一个。 Symfony documentation描述了如何激活/注册它。
例如,您可以在转换为DB值时提取数组并对其进行json编码:
json_encode($value->toArray())
json-decode并在转换为PHP值时将其包装回ArrayCollection:
new ArrayCollection(json_decode($value))
但它是你的映射类型,你可以随心所欲:)