我注意到在 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_array
或 json
作为类型不会返回一个对象,所以两者都是不可行的有没有人有解决方法或解决方案?我真的开始后悔从
MySQL
切换到 PostgreSQL
注意:代码在
MySQL
中运行良好,我刚刚切换了数据库。 最佳答案
您始终可以专门为 ArrayCollection 属性创建自己的映射类型。 Doctrine DBAL docs 和 ORM 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/