2016-04-07 14 views
1

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

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

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

ответ

1

Доктрина может содержать единственную ссылку на экземпляр объекта записи и не создавать совершенно новый экземпляр в вашем методе 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); 

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