我正在忙于一个项目,我遇到了一个小问题。我只是想知道是否有任何方法来定制特定实体的持久行为?在我的情况下,我想在更新时,在重新保存实体之前从其他表中删除一些字段。
为了论证,让我的实体说我希望自定义持久化操作看起来像这样:
/**
* @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来清除当前的数据?
答案 0 :(得分:2)
您可以使用prepersist:
/**
* @ORM\PrePersist
*/
有preupdate,preremove等。
在这里您可以获得所有信息:http://symfony.com/doc/current/book/doctrine.html
答案 1 :(得分:2)
您应该按照Cyrus的回答中的建议使用事件监听器或 -subscribers 而不是LifecycleCallbacks
(即@PrePersist
)。
使用LifecycleCallbacks,您无法访问不相关的实体,而您可以使用侦听器/订阅者更改/删除这些实体,您可以通过依赖注入直接访问实体管理器。