我有一个用户实体,它有一个 ArrayCollection of Subscriptions。我有这些二传手和吸盘手。
public function addSubscription(DogeWowBundleEntitySubscription $subscription)
{
$this->subscriptions[] = $subscription;
return $this;
}
public function removeSubscription(DogeWowBundleEntitySubscription $subscription)
{
$this->subscriptions->removeElement($subscription);
}
public function getSubscriptions()
{
return $this->subscriptions;
}
还有另一个实体称为计划。订阅基本上是用户和计划之间的中间实体,除了它包含一个额外的字段,因此必须是一个专用实体。
/**
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @ORMManyToOne(targetEntity="User", inversedBy="subscriptions")
* @ORMJoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $user;
/**
* @ORMManyToOne(targetEntity="Plan", inversedBy="subscriptions")
* @ORMJoinColumn(name="plan_id", referencedColumnName="id", onDelete="CASCADE")
*/
protected $plan;
/**
* @ORMColumn(type="date")
*/
protected $nextDue;
否则,它只是与自动生成的中间表的多对多关系。
现在,在"用户注册"窗体中,用户可以在"计划"表中使用此代码在"表单生成器"表中可用的计划之间进行选择
$builder->add('subscriptions', 'entity', array('class' => 'DogeWowBundle:Plan'))
如何在给定计划对象的情况下创建新的订阅对象?我会在控制器中这样做吗?使用数据转换器?对此的最佳实践是什么?
您有 2 个选项,第一个是您有一个包含表单的表单。 一个窗体映射到用户,另一个窗体映射到订阅。 所以基本上在你的用户形式中,你会有
$builder->add('subscriptions', new SubscriptionsType())
在该订阅类型中,您将拥有以下计划的实体:
$builder->add('plan', 'entity', array(
'class' => 'DogeWowBundle:Plan',
'property' => 'plan_name',
));
这样,您的订阅将自动生成并根据需要进行更新。
您也可以使用数据转换器,但我个人喜欢在表单中使用表单。