注意:vendor \ doctrine \ orm \ lib \ Doctrine \ ORM \ UnitOfWork.php第2735行(Symfony 2.1)中的未定义索引

时间:2012-10-24 21:07:02

标签: symfony doctrine-orm

我有两个与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 
}

0 个答案:

没有答案