我正在尝试基于另一个实体创建一个新实体。示例:我有一段感情
Sale <-- 1:M --> Payment
现在,当我坚持Sale
时,你必须创建一个初始Payment
,但我不确切知道它是怎么做的。
我试过了:
@ORM\HasLifecycleCallbacks()
,@ORM\prePersist
或@ORM\postPersist
,但这些方法无法获取参数,我无法保留实体Payment
。我甚至尝试将Sale
与Payment
(在prePersist方法$payment->setSale($this)
中)联系起来,希望EntityManager能够为我保留Payment
。 info from here SaleController::createAction()
中这样做,这种方式显然很简单并且有效,但这并不优雅,也违背了我的应用程序的良好设计,此操作是业务逻辑的一部分,并在各种重复份答案 0 :(得分:4)
在你看来的3个解决方案中,3个在我看来仍然是最不对的。它很简单,不会过于复杂,以后也很容易重构。
但如果您正在寻找一个干净的解决方案,我认为您需要的是表单处理程序或类似的服务。 看看FOSUserBundle one。
基本上你会创建一个PaymentManager类&amp;处理完所有销售表单后,将所有收集的信息传递给PaymentManager,让它处理Payment实体的所有创建/持久逻辑。
答案 1 :(得分:1)
我建议@Inori建议的PaymentManager
是最好的方法,它是DRY,也是创建实体的中心点。它允许您封送控制器中的所有用户输入,然后将其传递给管理器以正确构建Sale
对象。
如果您希望使用 1st 选项并使用生命周期回调,我假设您收到一个异常,说明在另一个实体上发现了一个非托管实体 - 或类似的东西。要解决此问题,您可以级联保留映射,这意味着您无需为persist
调用Payment
:
/**
* One-to-Many via Join Table (aka One-To-Many Unidirectional).
* @ORM\ManyToMany(targetEntity="Payment", cascade={"persist"})
* @ORM\JoinTable(
* inverseJoinColumns={
* @ORM\JoinColumn(unique=true, onDelete="CASCADE")
* }
* )
*/
如果您感到困惑,可以阅读有关One-To-One, Unidirectional的更多信息。
另外,您应该阅读有关级联持久性Transitive persistence / Cascade Operations的信息。