我有一个带有数组类型字段的 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 用于存储数组的字段吗?