OneToOne 関連付けに関連付けられた 2 つのエンティティがあります。これは、すべてがどのように見えるかです:
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks()
* @ORM\Table(name="a")
*/
class A
{
....
/**
* @ORM\OneToOne(targetEntity="B", cascade={"all"}, orphanRemoval=true)
* @ORM\JoinColumn(name="b_id", referencedColumnName="id", nullable=true)
*/
private $b;
}
/**
* @ORM\Entity
* @ORM\Table(name="b")
*/
class B
{
....
/**
* @ORM\Column(type="string", length=20)
*/
protected $type;
/**
* @ORM\Column(type="integer")
*/
protected $aId;
}
私がやろうとしているのは、 A クラスで lifeCycleCallback preUpdate を作成することです。preUpdate の呼び出し中、クラスにはすでに on ID があります。私はこのようなことをしようとしました:
/**
* @ORM\PreUpdate
*/
public function update()
{
if (is_null($this->getB()))
$this->b = new B();
$this->b->setAId($this->id)->setType('A'/* classname */);
}
B クラスは、クラス名を type フィールドに、オブジェクト ID を aId フィールドに格納する必要があります。ここでは外部キーを使用できません。
問題は、上記の update 関数が次のエラーを返すことです。
注意: 未定義のインデックス: C:...\vendor\doctrine\orm\lib\Doctrine\ORM\UnitOfWork.php 行 2735 の 000000006914b7950000000033b7b784
このエラーの意味と解決方法はありますか?
編集 これは、編集フォームに渡す前に A オブジェクトを取得する方法です。
$this->getEntityManager()
->createQueryBuilder()
->select('a,b')
->from('MyBundle:A', 'a')
->leftJoin('a.b','b')
->where('a.id = :aId')
->setParameter('aId', $id)
->getQuery()->getSingleResult();
私はAオブジェクトのみを(フォームで)編集し、最初のA更新で関連するBオブジェクトを作成し、Aの次の更新ごとにこのBオブジェクトにいくつかの変更を加えたい.
EDIT2
上記のエラーは表示されなくなりました。ただし@ORM\PreUpdate
、 A オブジェクトの B オブジェクトに加えられた変更は、関連付けが であっても永続化されませんcascade={"all"}
。次に例を示します。
/**
* inside A class !
*
* @ORM\PreUpdate
*/
public function update()
{
$this->lastModified = new \DateTime();
$this->getB()
->setSomething('something'); // <-- this is never stored to db by cascade
}