2013-04-08 4 views
2

Речь идет о доктрине 1.2 и Symfony 1.4массив Нагрузки Doctrine_Collection

Короче: Я бегу простой запрос 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
  1. Во время Doctrine_Collection::fromArray (synchronizeFromArray тоже) записей первичных ключей (DoctrineRecord::_id массив) не будет обновляться.

  2. DoctrineRecord::toArray() будет перезаписывать все значения столбцов первичного ключа с результатом DoctrineRecord::getIncremented(), который из-за точки 1. пуст.

Один из способов справиться с этим, чтобы изменить свой $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 массив к вашему записей.