问题: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_arrayjson作为类型不会返回对象,因此两者都是不行的

有没有人对此有解决方法或解决方案?我真的开始后悔从MySQL切换到PostgreSQL

注意:代码在MySQL中运行良好,我只是切换了数据库。

解答

您始终可以专门为 ArrayCollection 属性创建自己的映射类型。 DoctrineDBAL 文档和ORM 食谱描述了如何创建一个。Symfony 文档描述了如何激活/注册它。

例如,您可以在转换为 DB 值时提取数组并对其进行 json 编码:

json_encode($value->toArray())

并在转换为 PHP 值时进行 json-decode 并将其包装回 ArrayCollection:

new ArrayCollection(json_decode($value))

但这是你的映射类型,你可以做任何你想做的事情:)

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐