PostgreSQL中的Doctrine ORM ArrayCollection

时间:2016-06-03 14:00:21

标签: php postgresql doctrine-orm symfony

我在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_arrayjson作为类型并不会返回一个对象,因此两者都是禁止的

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

注意:代码在MySQL中工作正常,我只是切换了数据库。

2 个答案:

答案 0 :(得分:0)

我自己也有这个问题,我不确定为什么postgresql会截断序列化的字符串,即使字段被标记为文本。我的建议是你将列类型转换为json_array,因为postgresql有一个本机类型。否则,您也可以使用自定义类型

答案 1 :(得分:0)

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

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

json_encode($value->toArray())

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

new ArrayCollection(json_decode($value))

但它是你的映射类型,你可以随心所欲:)