У меня есть объект Doctrine с полем типа массива:
/**
* @ORM\Table()
*/
class MyEntity
{
(...)
/**
* @var array $items
*
* @ORM\Column( type="array" )
*/
private $items;
/**
* @param SomeItem $item
*/
public function addItem(SomeItem $item)
{
$this->items[] = $item;
}
(...)
}
Если я добавляю элемент в массив, этот код работает правильно:
$myEntityObject->addItems(new SomeItem());
$EntityManager->persist($myEntityObject);
$EntityManager->flush();
$myEntityObject
сохраняется в базу данных с правильными данными (массив сериализуется и десериализуется при запросе к базе данных).
К сожалению, когда я изменяю один из объектов внутри массива без изменения размера этого массива, Doctrine ничего не делает, если я пытаюсь сохранить изменения в базе данных.
$items = $myEntityObject->getItems();
$items[0]->setSomething(123);
$myEntityObject->setItems($items);
$EntityManager->persist($myEntityObject);
$EntityManager->flush();
print_r($myEntityObject);
Хотя print_r
в последней строке этого кода отображает измененные данные объекта, Doctrine не знает, что что-то изменилось внутри массива, если размер массива не изменился. Есть ли способ заставить Doctrine сохранить изменения, сделанные в этом поле (или мягко сообщить об изменениях в этом поле, которые необходимо сохранить)?
Только что нашел в документации способ решения моей проблемы:
http://docs.doctrine-project.org/en/latest/reference/change-tracking-policies.html
Требуется много изменения в коде, но это работает. Кто-нибудь знает, как сохранить политику отслеживания по умолчанию для других полей и использовать NotifyPropertyChanged только для поля, в котором хранится массив?