3

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 
}
4

0 に答える 0