在 Doctrine 中用于 simple_array 字段的数组到字符串转换

Posted

技术标签:

【中文标题】在 Doctrine 中用于 simple_array 字段的数组到字符串转换【英文标题】:Array to string conversion in Doctrine for simple_array field 【发布时间】:2015-09-20 22:27:34 【问题描述】:

我想将数据从 JSON 文件导入数据库表。我将 Doctrine 与 pdo_sqlite 驱动程序一起使用,并配置了以下实体:

/**
 * @Entity @Table(name="mytable")
 **/
class MyClass

    /** @Id @Column(type="integer") @GeneratedValue *
     * @Column(type="integer")
     */
    var $id;

    /** @Column(type="string") **/
    var $name;


    /** @Column(type="simple_array") **/
    var $parameters;

    function __construct($name, $parameters)
    
        $this->name = $name;
        $this->parameters = $parameters;
    

    // getters and setters here

我创建了一个简单的导入方法:

function importFromJson($tableName, $fileName)
    
        if (file_exists($fileName)) 
            $data = json_decode(file_get_contents($fileName));
            if (is_array($data)) 
                $connection = getEm()->getConnection();
                foreach($data as $tuple) 
                    if (is_object($tuple)) 
                        $connection->insert($tableName, (array)$tuple);
                    
                
            
        
    

我的 import.json 文件包含以下文本:

[
  
    "name": "A name",
    "parameters": ["a","b","c"]
  
]

当我调用我的导入方法时:

importFromJson("mytable", "import.json");

我收到以下错误:

执行 'INSERT INTO mytable 时发生异常 (名称,参数)值(?,?)' 带参数 ["A name", ["a","b","c"]]:

数组到字符串的转换 C:\myproject\vendor\doctrine\dbal\lib\Doctrine\DBAL\DBALException.php:119 C:\myproject\vendor\doctrine\dbal\lib\Doctrine\DBAL\Connection.php:996 C:\myproject\vendor\doctrine\dbal\lib\Doctrine\DBAL\Connection.php:696 C:\myproject\lib\import.php:39

simple_array 类型的确切用途不就是将数组转换为可以存储在数据库中的字符串吗?

【问题讨论】:

如果需要存储数组数据,试试json_encode($array)函数。这会将您的数组转换为字符串。然后在检索数据时,调用json_decode($string) 函数。 不应该是automatically handled when I configure a simple_array field 吗? 我明白了。如果你尝试设置简单的空数组会发生什么? 出现同样的错误,如果我使用“array”类型而不是“simple_array”,同样的事情。更奇怪的是:如果我使用“object”类型并将 JSON 文件替换为以下内容:[ “name”:“A name”,“parameters”: ] 我收到错误“Object of class stdClass 无法转换为字符串" 为了清楚起见,您使用的是哪个版本的 Doctrine? 【参考方案1】:

我不知道为什么您必须将参数像数组一样存储在数据库中,但是首先您应该将parameters 转换为有效字符串,否则它无法正确存储。

foreach($data as $tuple) 
    if (is_object($tuple)) 
        $touple = implode(",", (array)$touple);
        $connection->insert($tableName, (array)$tuple);
    

另一种选择是将其转换为 json 字符串

foreach($data as $tuple) 
    if (is_object($tuple)) 
        $touple = json_encode($touple);
        $connection->insert($tableName, (array)$tuple);
    

为了能够在使用select 时使用数据,您应该再次使用explode()json_encode 将数据转换回数组。希望这个锅! :)

【讨论】:

我当然可以手动完成,但我认为配置simple_array field 的全部目的是它会自动处理这些转换

以上是关于在 Doctrine 中用于 simple_array 字段的数组到字符串转换的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 咨询锁不适用于 Doctrine 的 DBAL

如何将 ZendOpCache 用于 Doctrine2 缓存?

Symfony Doctrine 验证不适用于可嵌入的注释

sql查询不适用于doctrine 2

CodeIgniter + Doctrine:控制器中的 CRUD?

用于标量查询的 Doctrine 返回数组数组