【发布时间】:2012-12-06 19:44:16
【问题描述】:
我正在开发一个使用类表继承的 Symfony2/Doctrine 应用程序 (http://docs.doctrine-project.org/en/2.0.x/reference/inheritance-mapping.html#class-table-继承)来管理咨询中的投诉。每个咨询可以有许多投诉(OneToMany),并且每种不同类型的投诉都有不同的结构和外观。投诉是一个集合,用JS动态添加。
此时,我能够持久化投诉并将它们链接到咨询,方法是在持久化之前将它们重铸为控制器中的适当类型。我遇到了一些问题,我计划将其迁移到表单事件(http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html)或类似性质的东西以简化流程.
然而,此时我遇到的问题是,我无法使用 FormView 在视图中显示现有的投诉,因为表单构建器要求我设置要显示的集合的类型。如果每个咨询只有一种类型的投诉,那很好,但它们可以有多种类型,并且在表单构建器中设置类型会将我限制为一种类型。
在没有类型的情况下,我是否可以采取一些方法来阻止 FormView 转换为字符串,或者以某种方式在每个投诉的基础上动态检测和分配类型(使用 $complaint->getComplaintType (),也许)?
<?php
namespace Acme\ConsultBundle\Entity;
class Consult
{
/**
* @ORM\OneToMany(targetEntity="Acme\ConsultBundle\Entity\ComplaintBase", mappedBy="consult", cascade={"persist", "remove"})
*/
protected $complaints;
}
?>
<?php
namespace Acme\ConsultBundle\Entity;
/**
* Acme\ConsultBundle\Entity\ConsultBase
*
* @ORM\Entity
* @ORM\Table(name="ConsultComplaintBase")
* @ORM\HasLifecycleCallbacks
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="complaint_name", type="string")
* @ORM\DiscriminatorMap({
* "ComplaintDefault" = "Acme\ConsultBundle\Entity\ComplaintDefault",
* "ComplaintRosacea" = "Acme\ConsultBundle\Entity\ComplaintRosacea",
* "ComplaintBotox" = "Acme\ConsultBundle\Entity\ComplaintBotox",
* "ComplaintAcne" = "Acme\ConsultBundle\Entity\ComplaintAcne",
* "ComplaintUrticaria" = "Acme\ConsultBundle\Entity\ComplaintUrticaria",
* })
*/
abstract class ComplaintBase
{
/**
* @ORM\ManyToOne(targetEntity="Acme\ConsultBundle\Entity\Consult", inversedBy="complaints")
* @ORM\JoinColumn(name="consult_id", referencedColumnName="id")
*/
protected $consult;
/**
* @ORM\Column(type="string", length="255")
*/
protected $complaintType;
}
?>
<?php
namespace Acme\ConsultBundle\Form\Type;
class ConsultType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->add('complaints', 'collection', array(
// 'type' => new ComplaintUrticariaType(),
'error_bubbling' => true,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
));
}
}
?>
【问题讨论】:
-
我遇到了完全相同的问题。你找到解决办法了吗?
-
我最终做了我在坚持投诉(JOINed 实体)时所做的同样的事情。然后,我将一组重铸的投诉传递到模板中进行渲染。这种方法使用的数据库调用比我希望的要多。
标签: forms symfony doctrine single-table-inheritance class-table-inheritance