在Doctrine中为simple_array字段进行数组到字符串转换

时间:2015-07-03 07:10:08

标签: php arrays doctrine-orm

我想将数据从JSON文件导入数据库表。我正在使用带有pdo_sqlite驱动程序的Doctrine并配置以下实体:

/**
 * @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时发生异常   (名称,参数)VALUES(?,?)'   用params [“A name”,[“a”,“b”,“c”]]:

     

数组到字符串转换   C:\ MyProject的\厂商\教义\ DBAL \ lib中\学说\ DBAL \ DBALException.php:119   C:\ MyProject的\供应商\原则\ DBAL \ LIB \原则\ DBAL \ Connection.php:996   C:\ MyProject的\供应商\原则\ DBAL \ LIB \原则\ DBAL \ Connection.php:696   C:\ MyProject的\ lib中\ import.php:39

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

1 个答案:

答案 0 :(得分:-1)

我不知道为什么你必须像数组一样在数据库中存储params但是一个简单的方法来存储它,你应该将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将数据转换回数组。希望这个! :)