Postgres阵列处理原则2,Symfony 2.2



我正试图在postgres DB中使用整数数组数据类型,使用Doctrine 2作为ORM。最初,我在Symfony中将表单字段创建为实体类型,并假设这些实体是此错误的来源:

request.CRITICAL: DoctrineDBALDBALException: An exception occurred while executing 'INSERT INTO actions (bundle_key, name, type, num_installs, countries, enabled) VALUES (?, ?, ?, ?, ?, ?)' with params ["05e4a7e5", "sfsdfdsfs", "1", "3", "O:43:"Doctrine\Common\Collections\ArrayCollection":1:{s:54:"u0000Doctrine\Common\Collections\ArrayCollectionu0000_elements";a:3:{i:0;O:39:"... truncated for SO question ...Bundle\Entity\Countryu0000latitude";s:5:"18.25";s:50:"u0000AirInstaller\AdminBundle\Entity\Countryu0000longitude";s:8:"-63.1667";}}}", "true"]:

SQLSTATE[22P02]: Invalid text representation: 7 ERROR: array value must start with "{" or dimension information (uncaught exception) at /Users/steveadams/Sites/airinstaller/vendor/doctrine/dbal/lib/Doctrine/DBAL/DBALException.php line 47 [] []

看到正在进行的疯狂序列化,我决定尝试通过构建一个选择字段来将国家存储为其ID,这样字段就不会被解释为实体。这也失败了。然后我决定查看文档,在文档中我发现在条令中对数组的支持实际上只是php数组的序列化字符串!如果我的列类型实际上是数据库中的数组,那么这根本不起作用。

所以我的难题是:我是否创建一个自定义映射类型,以postgres integer[]的正确格式存储这些国家/地区:{2,13,26,43}

还是我要求我的数据库管理员将列更改为字符并存储Doctrine想要使用的序列化数组?这看起来太脏了。

不管怎样,我都很失望。我想我做错了什么,因为这里的底线是Doctrine不支持开箱即用的整数。真的是这样吗?

感谢您的意见!

这是我决定做的。

由于我放弃了关系,选择存储国家/地区的平面id数组,所以我的选择只是编写一个自定义映射类型,该类型对数据类型进行基本断言,并以字符串格式编写一个postgres友好的id数组。我做了一些卫生工作,以确保ID在数据库中引用真实的国家,因此,不幸的是,这项工作不再由Doctrine完成。从好的方面来看,这是一个简单的过程,可以与新数据库无缝配合。

映射类型为多维数组递归,因此它适用于相当复杂的数据。不幸的是,这些数据不能基于条令模型,从而利用了该框架的优势。这似乎是一个权衡的问题。在我的所有研究中,似乎根本不可能将Doctrine与postgres的一些数据类型轻松集成。