Doctrine2 - 自定义持久性

时间:2013-11-19 14:04:29

标签: symfony doctrine-orm

我正在忙于一个项目,我遇到了一个小问题。我只是想知道是否有任何方法来定制特定实体的持久行为?在我的情况下,我想在更新时,在重新保存实体之前从其他表中删除一些字段。

为了论证,让我的实体说我希望自定义持久化操作看起来像这样:

/**
* @ORM\Table()
* @ORM\Entity
*/
class A {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
    * @ORM\OneToMany(targetEntity="B", mappedBy="bar")
    * @ORM\Column(name="foo")
    */
    private $foo;

    //Some additional getters and setters here
}

/**
* @ORM\Table()
* @ORM\Entity
*/
class B {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
    * @ORM\ManyToOne(targetEntity="A", inversedBy="foo")
    * @ORM\JoinColumn(name="bar", referencedColumn="id")
    */
    private $bar;

    //Getters and setters here. 
}

现在我知道一个简单的例子,如果你更新它,这个学说会自动只更新B类中的$ bar,但是我只想说我想先完全删除$ bar(不只是更新它)并重新用新值保存吗?这可能吗?

这也可以在坚持我的更新操作之前手动完成,但感觉有点hacky?

我想要实现的实际代码在这里发布的时间太长了,所以我只是选择了一个简单的概念验证。

感谢您的帮助!

修改

从技术上讲,其他实体将通过OneToMany / ManyToMany / ManyToOne关系与当前实体相关,如上例所示。那么在使用提交的数据给实体加水合之前,我是否可以使用preHydrate来清除当前的数据?

2 个答案:

答案 0 :(得分:2)

您可以使用prepersist:

/**
* @ORM\PrePersist
*/

有preupdate,preremove等。

在这里您可以获得所有信息:http://symfony.com/doc/current/book/doctrine.html

答案 1 :(得分:2)

您应该按照Cyrus的回答中的建议使用事件监听器 -subscribers 而不是LifecycleCallbacks(即@PrePersist)。

使用LifecycleCallbacks,您无法访问不相关的实体,而您可以使用侦听器/订阅者更改/删除这些实体,您可以通过依赖注入直接访问实体管理器。

请参阅文档章节How to Register Event Listeners and Subscribers