Symfony2/Doctrine:如何从实体类中持久化一个实体?
Posted
技术标签:
【中文标题】Symfony2/Doctrine:如何从实体类中持久化一个实体?【英文标题】:Symfony2/Doctrine: How to persist an entity from the entity class? 【发布时间】:2012-09-01 15:09:41 【问题描述】:问题的简短描述: 我在实体类中生成一个文件,并希望将文件名保存到数据库中。控制器不知道这一点(无论文件名是否已更改,因此从控制器中持久化是不切实际的。
有没有办法让实体保持自身?
我的使用示例: 实体类用于图库中的图像。我总是保留原始文件并使用文件的缓存版本。当图像更改(例如旋转)时,缓存的版本将被删除。在其他情况下,缓存的版本也会被删除。当需要该文件时,我会检查缓存文件是否存在,否则会使用存档图像中的新文件名重新生成它。我需要一个新的文件名,因为它会重置各种缩略图大小的缓存。
当我生成那个新文件时,我必须以某种方式将它的文件名保存到数据库中。因为只在Entity中决定何时重新生成图像,所以如果实体可以将自己持久化到数据库中是可行的,但我还没有找到解决方案。
有没有办法做到这一点,或者我应该使用一个完全不同的概念来重新生成图像文件?
【问题讨论】:
没有问题。您仅将实体持久化一次,然后您就可以使用学说为您创建的实体。如果您有一个包含两个字段 [orig_filename, cached_filename] 的实体,并且该实体由学说管理,那么当您更改任何属性时,它将自动在 flush() 上更新数据库。 【参考方案1】:Doctrine 中的实体不是active records - 它们自己无法执行持久化操作,因此它们依赖于老大哥[实体管理器]。
即使控制器不知道任何文件名是否已更改,您知道 - 每次都保留您的图片:如果没有任何更改,Doctrine 不会触及实体。 p>
也看看lifecycle events,也许你会发现在持久性之前触发@PreUpdate
方法很有用[例如。生成缩略图]。
【讨论】:
我有点期待,但感谢您的准确解释。从控制器持久化并不是一个真正的选择,因为文件的重新生成实际上也可以由模板触发(如果文件不存在,则为 entity.getWebPath)。 但是:使用生命周期事件可能是一个非常好的主意,它可以在 postLoad 上重新生成文件,而不是在我想显示它的时候。 Aaaarg,我是 Stackoverfow 的新手,它太早保存了我的评论...我将使用 postLoad,然后在我渲染模板之前生成文件,我可以从控制器。谢谢你的回答。 与你的问题无关,只是为了让你知道,如果你过早保存评论(或问题或答案),你可以编辑它并修改它,无需添加一条新评论以上是关于Symfony2/Doctrine:如何从实体类中持久化一个实体?的主要内容,如果未能解决你的问题,请参考以下文章
Symfony2/Doctrine - 与普通 SQL 相关的实体抽象
Symfony2 - Doctrine - 在实体管理器刷新调用中捕获错误
Symfony2 / Doctrine中的实体和模型有啥区别