我有一个带有数组类型字段的 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 http://docs.doctrine-project.org/en/latest/reference/change-tracking-policies.html
它需要对代码进行大量更改,但它可以工作。有人知道如何保留其他字段的默认跟踪策略并仅对存储数组的字段使用 NotifyPropertyChanged 吗?