PostgreSQL 中的 Doctrine ORM ArrayCollection
问题:PostgreSQL 中的 Doctrine ORM ArrayCollection 我注意到在 PostgreSQL 数据库中使用 Doctrine ORM 的ArrayCollection有一些奇怪的事情(在 Symfony 3 项目中使用它)。 以我的带有角色的User类为例,它使用默认角色ROLE_USER启动,并且必须是array类型。 class User implements
问题:PostgreSQL 中的 Doctrine ORM ArrayCollection
我注意到在 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:"
尝试以User
身份登录时会出现Serialization
错误,因为数据库中显然缺少ArrayCollection
的一部分。
在谷歌搜索解决方案后,我遇到了这个 Github 问题。据我了解,这是一个错误,您不能在PostgreSQL
环境中使用ArrayCollection
。
不在@ORM\Column
标签中定义类型也无济于事,然后它将以下内容存储在数据库中,并且Symfony
无法使用它来检索角色。Doctrine\Common\Collections\ArrayCollection@000000002300d10300000000545301a6
并且使用simple_array
或json
作为类型不会返回对象,因此两者都是不行的
有没有人对此有解决方法或解决方案?我真的开始后悔从MySQL
切换到PostgreSQL
注意:代码在MySQL
中运行良好,我只是切换了数据库。
解答
您始终可以专门为 ArrayCollection 属性创建自己的映射类型。 DoctrineDBAL 文档和ORM 食谱描述了如何创建一个。Symfony 文档描述了如何激活/注册它。
例如,您可以在转换为 DB 值时提取数组并对其进行 json 编码:
json_encode($value->toArray())
并在转换为 PHP 值时进行 json-decode 并将其包装回 ArrayCollection:
new ArrayCollection(json_decode($value))
但这是你的映射类型,你可以做任何你想做的事情:)
更多推荐
所有评论(0)