我注意到在 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 的一部分显然在数据库中丢失了。

在谷歌搜索解决方案后,我遇到了 this Github issue 。据我了解,这是一个错误,您不能在 ArrayCollection 环境中使用 PostgreSQL

不在 @ORM\Column 标签中定义类型也无济于事,然后它将以下内容存储在数据库中,Symfony 无法使用它来检索角色。 Doctrine\Common\Collections\ArrayCollection@000000002300d10300000000545301a6并且使用 simple_arrayjson 作为类型不会返回一个对象,所以两者都是不可行的

有没有人有解决方法或解决方案?我真的开始后悔从 MySQL 切换到 PostgreSQL
注意:代码在 MySQL 中运行良好,我刚刚切换了数据库。

最佳答案

您始终可以专门为 ArrayCollection 属性创建自己的映射类型。 Doctrine DBAL docsORM cookbook 描述了如何创建一个。 Symfony documentation 描述了如何激活/注册它。

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

json_encode($value->toArray())

并在转换为 PHP 值时进行 json-decode 并将其包装回 ArrayCollection 中:
new ArrayCollection(json_decode($value))

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

关于php - PostgreSQL 中的 Doctrine ORM ArrayCollection,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37616407/

10-09 19:11