将数组加载到Doctrine Collection

时间:2013-04-08 17:05:37

标签: php symfony1 doctrine doctrine-1.2

问题是关于学说1.2和Symfony 1.4

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

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

以下是代码示例:

// 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但是它给出了相同的结果

1 个答案:

答案 0 :(得分:1)

  1. Doctrine_Collection::fromArraysynchronizeFromArray)期间,记录主键(DoctrineRecord::_id数组)无法更新。

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

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

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

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

    这样跟随来自Doctrine_Record :: fromArray()的代码:

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

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