我注意到了在PostgreSQL数据库中使用Doctrine的PostgreSQL(在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身份登录时产生一个User错误,因为显然数据库中缺少ArrayCollection的一部分。
在谷歌搜索解决方案后,我偶然发现了这个吉特布问题。据我所知,这是一个bug,您不能在ArrayCollection环境中使用它。
不定义@ORM\Column标记中的类型也没有帮助,因此它会将以下内容存储在数据库中,并且Symfony无法使用它来检索角色。Doctrine\Common\Collections\ArrayCollection@000000002300d10300000000545301a6和使用simple_array或json作为类型不会返回一个对象,所以两者都是no-go
有人能找到解决办法或解决方案吗?我真的开始后悔从MySQL转到PostgreSQL
注意:代码在MySQL中运行良好,我刚刚切换了数据库。
发布于 2016-06-08 19:43:10
您始终可以为ArrayCollection属性创建自己的映射类型。理论DBAL文档和奥姆食谱描述了如何创建一个。Symfony文档描述了如何激活/注册它。
例如,您可以提取数组并在转换为DB值时对其进行json编码:
json_encode($value->toArray())和json-解码,并在转换为ArrayCollection值时将其打包回一个PHP:
new ArrayCollection(json_decode($value))但是这是您的映射类型,您可以做任何您想做的事情:)
发布于 2016-06-06 22:00:49
我自己也有这个问题,我不清楚为什么postgresql会截断序列化的字符串,甚至连字段都标记为text。我的建议是将列类型转换为json_array,因为postgresql有一个本机类型。否则,还可以使用以下自定义类型
https://stackoverflow.com/questions/37616407
复制相似问题