Symfony2 表单实体处理



我有一个用户实体,它有一个 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',
));

这样,您的订阅将自动生成并根据需要进行更新。

您也可以使用数据转换器,但我个人喜欢在表单中使用表单。

最新更新