配列型フィールドを持つ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
正しいデータでデータベースに保存されます (配列はシリアル化され、データベースのクエリ時に逆シリアル化されます)。
残念ながら、配列のサイズを変更せずに配列内のオブジェクトの 1 つを変更すると、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 を使用する方法を知っている人はいますか?