我有两个与OneToOne关联相关的实体。 这就是它的样子:
/**
* @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时,A类已经具有其ID。我试图做这样的事情:
/**
* @ORM\PreUpdate
*/
public function update()
{
if (is_null($this->getB()))
$this->b = new B();
$this->b->setAId($this->id)->setType('A'/* classname */);
}
B类必须在类型字段中存储类名,在aId字段中存储对象ID。我不能在这里使用外键。
问题是上面的更新函数返回了这个错误:
注意:未定义的索引:000000006914b7950000000033b7b784在C:... \ vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ UnitOfWork.php第2735行
任何想法这个错误意味着什么以及如何解决它?
修改 这是我在将对象传递给编辑表单之前获取对象的方法:
$this->getEntityManager()
->createQueryBuilder()
->select('a,b')
->from('MyBundle:A', 'a')
->leftJoin('a.b','b')
->where('a.id = :aId')
->setParameter('aId', $id)
->getQuery()->getSingleResult();
我只编辑一个对象(在表单中),并希望在第一次A更新时创建关联的B对象,并在每次下次更新A时对此B对象进行一些更改。
EDIT2
上述错误不再显示。但是,即使关联具有@ORM\PreUpdate
,对A对象的cascade={"all"}
中的B对象所做的更改也不会保留。
这是一个例子:
/**
* inside A class !
*
* @ORM\PreUpdate
*/
public function update()
{
$this->lastModified = new \DateTime();
$this->getB()
->setSomething('something'); // <-- this is never stored to db by cascade
}