Объекты коллекции Doctrine заменяются значениями БД при повторном вызове из базы данных. - PullRequest
0 голосов
/ 18 января 2019

Необходимо изменить некоторые значения объекта коллекции доктрин, извлеченной из базы данных, и снова сохранить в базе данных. Для этого есть старый письменный код и В, что они использовали цикл для сохранения объектов один за другим. Причина сохранения объектов один за другим заключается в том, что в середине выполняются некоторые другие процессы. В конце первого цикла есть функция, которая пытается получить другую коллекцию доктрин из базы данных. Теперь вся эта коллекция состоит из значений в БД. Из-за этого 1-ая коллекция заменяется существующими значениями базы данных. Так что процесс обновления не работает. Почему это происходит?

Пример кода:

class mainAction extends sfAction {

      function execute($request) {
          $a = new ExampleA();
          $collection = $a->updateDoctrineCollectionWithNewValues(6);

          $b = new ExampleB();
          $b->saveDoctrineCollectionToDB($collection);
      }
}

class ExampleA {

    function updateDoctrineCollectionWithNewValues($empNumber){
       $empSalaryComponents = Doctrine_Core::getTable('EmployeeSalaryComponent');

    $empSalComCollection = $empSalaryComponents->findBy('employee_number', $empNumber);

    foreach ($empSalComCollection as $empSalComponent) {
        $empSalComponent->setValue(9999999999999);
    }

    return $empSalComCollection;
}

}

 class ExampleB {

       function saveDoctrineCollectionToDB($doctrineCollection){
            var_dump($doctrineCollection->toArray()); // 1st var_dump
            foreach ($doctrineCollection as $object) {
              $this->addToLogger($object);
              var_dump($doctrineCollection->toArray()); //2nd var_dump
              die;
            }
       }

       function addToLogger($object) {
          $empSalaryComponents = Doctrine_Core::getTable('EmployeeSalaryComponent')->findBy('employee_number', $object->getEmployeeNumber());
           /**
             * Do something
           **/
       }

}

Результаты

1-й var_dump:

array (size=4)
  0 => 
    array (size=5)
      'employee_number' => string '6' (length=1)
      'salary_component_id' => string '1' (length=1)
      'value' => int 9999999999999
      'effectiveDate' => string '2019-01-15' (length=10)
      'is_active' => string '1' (length=1)
  1 => 
    array (size=5)
      'employee_number' => string '6' (length=1)
      'salary_component_id' => string '2' (length=1)
      'value' => int 9999999999999
      'effectiveDate' => string '2019-01-15' (length=10)
      'is_active' => string '1' (length=1)
  2 => 
    array (size=5)
      'employee_number' => string '6' (length=1)
      'salary_component_id' => string '3' (length=1)
      'value' => int 9999999999999
      'effectiveDate' => string '2019-01-15' (length=10)
      'is_active' => string '1' (length=1)
  3 => 
    array (size=5)
      'employee_number' => string '6' (length=1)
      'salary_component_id' => string '4' (length=1)
      'value' => int 9999999999999
      'effectiveDate' => string '2019-01-19' (length=10)
      'is_active' => string '1' (length=1)

2-й var_dump:

  0 => 
    array (size=5)
      'employee_number' => string '6' (length=1)
      'salary_component_id' => string '1' (length=1)
      'value' => string '6787' (length=4)
      'effectiveDate' => string '2019-01-15' (length=10)
      'is_active' => string '1' (length=1)
  1 => 
    array (size=5)
      'employee_number' => string '6' (length=1)
      'salary_component_id' => string '2' (length=1)
      'value' => string '71111' (length=5)
      'effectiveDate' => string '2019-01-15' (length=10)
      'is_active' => string '1' (length=1)
  2 => 
    array (size=5)
      'employee_number' => string '6' (length=1)
      'salary_component_id' => string '3' (length=1)
      'value' => string '34%' (length=3)
      'effectiveDate' => string '2019-01-15' (length=10)
      'is_active' => string '1' (length=1)
  3 => 
    array (size=5)
      'employee_number' => string '6' (length=1)
      'salary_component_id' => string '4' (length=1)
      'value' => string '6787' (length=4)
      'effectiveDate' => string '2019-01-19' (length=10)
      'is_active' => string '1' (length=1)

2-ая переменная var_dump заполняется значениями в дБ после вызова дб в середине цикла.

Конверт: Doctrine 1.2, Php7.2, Symfony 1.4

...