Из класса записей Doctrine запрос одной и той же записи из БД перезаписывает свойства в этом классе.

В одном из моих классов записей Doctrine есть метод preSave, который выполняет проверку. В этой проверке выполняется запрос к той же таблице, которой принадлежит моя запись. Этот запрос извлечет одну запись из таблицы, и я использую расширенный результат для сравнения с текущей записью, представленной классом.

В некоторых случаях полученный гидратированный результат будет той же записью, что и та, с которой я работаю при проверке preSave. Однако, когда это происходит, любые изменения, внесенные в первую запись, отменяются после завершения запроса.

Почему это происходит? Есть ли обходной путь?


person Kevin Lee    schedule 07.04.2016    source источник


Ответы (1)


Doctrine может поддерживать единственную ссылку на экземпляр объекта записи и не создавать совершенно новый экземпляр в вашем методе preSave(). Поэтому, когда объект гидратируется, любые другие переменные того же типа в вашем коде «обновляются».

Чтобы убедиться в этом, проверьте идентификаторы объектов переменных в вашем коде, используя spl_object_hash(). функция.

Не видя вашего кода, предложения обходного пути могут различаться, но один из возможных обходных путей — гидратация массива в preSave():

$query = Doctrine_Query::create()
->select('foo')
->from('Bar b')
->where('b.id = ?', $id);

$results = $query->execute(array(), Doctrine::HYDRATE_ARRAY);

Вы потеряете возможность использовать результат как объект, но сможете использовать содержимое массива для сравнений.

person Kris Peeling    schedule 09.04.2016