【问题标题】:Load array to Doctrine_Collection将数组加载到 Doctrine_Collection
【发布时间】:2013-03-30 21:04:34
【问题描述】:

问题是关于学说 1.2 和 Symfony 1.4

简而言之:我正在运行简单的 SQL 查询并使用 PDO 将结果提取到数组中。之后,我为我从中获取数据的同一个表创建 Doctrine_Collection 并调用 synchronizeFromArray 以将数据加载到集合中。

一切都很好 - 集合已创建,并且我的主键旁边的所有数据恰好是布尔值 false 而不是真实值。

下面是代码示例:

// Fetch single object from DB
$sql = "SELECT * FROM payments LIMIT 1";
$p = $connection->query($sql)->fetchAll(PDO::FETCH_ASSOC);

var_dump($p); // I see that all the data including `id` is ok

$c = new Doctrine_Collection('Payment', 'id');
$c->synchronizeFromArray($p);

var_dump($c->toArray()); // All the data is ok but `id` == false

我尝试使用 Doctrine_Collection::fromArray 而不是 synchronizeFromArray 但它给出了相同的结果

【问题讨论】:

    标签: php symfony1 doctrine doctrine-1.2


    【解决方案1】:
    1. Doctrine_Collection::fromArraysynchronizeFromArray 也是)期间,记录主键(DoctrineRecord::_id 数组)不会更新。

    2. DoctrineRecord::toArray() 将用 DoctrineRecord::getIncremented() 的结果覆盖所有主键列值,因为第 1 点为空。

    解决此问题的一种方法是在执行fromArray() 之前修改您的$p 数组。 在您的数组中,您应该将主键名称更改为 _identifier

    在您的情况下,最简单的解决方案是修改您的 SQL 查询:

    $sql = "SELECT `id` as `_identifier`, * FROM payments LIMIT 1";
    

    这种方式遵循 Doctrine_Record::fromArray() 中的代码:

    if ($key == '_identifier') {
        $refresh = true;
        $this->assignIdentifier($value);
        continue;
    }
    

    将为您的记录分配正确的_id 数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-29
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多