我有一个实体,有太多的字段和数据要由MySQL处理。
所以我创建了另一个实体来存储内容并将其链接到具有OneToOne关系的父实体。
这是我的父实体HomeContent
的摘录
// ...
class HomeContent
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="locale", type="string", length=6)
*/
private $locale;
/**
* @var string
*
* @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
*/
private $healthIntro;
/**
* @var string
*
* @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
*/
private $desktopIntro;
/**
* @var string
*
* @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
*/
private $techIntro;
// ...
public function __construct()
{
$this->healthIntro = new ContentBlock();
$this->desktopIntro = new ContentBlock();
$this->techIntro = new ContentBlock();
// ...
我的ContentBlock
entity有一个文本字段content
与setter和getter。
现在我想简单地用每个字段的textarea
渲染我的表单,最好的方法是什么?
现在,它们被渲染为select
元素,我用内容字段定义了一个ContentBlockType
类
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('content', 'textarea');
}
// ...
当然还有HomeContentType
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', 'text')
->add('metadescription', 'text')
->add('healthIntro', 'entity', array(
'class' => 'NavaillesMainBundle:ContentBlock'
))
// ...
首先,我建议遵守使用JoinColumn()
annotation的规则。例:
/**
* @var string
*
* @ORM\OneToOne(targetEntity="ContentBlock", cascade={"all"})
* @ORM\JoinColumn(name="desktop_intro_id", referencedColumnName="id")
*/
private $desktopIntro;
回答:
我不知道我的方式是否最好,但我建议您创建ContentBlockFormType并将其嵌入到您的表单中。所以HomeContent实体的形式如下:
// ...
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', 'text')
->add('metadescription', 'text')
->add('desktopIntro', ContentBlockFormType::class, [
'label' => 'Desktop intro',
'required' => false,
])
->add('healthIntro', ContentBlockFormType::class, [
'label' => 'Health intro',
'required' => false,
])
->add('techIntro', ContentBlockFormType::class, [
'label' => 'Tech intro',
'required' => false,
])
}
// ...