我有一个实体,有太多的字段和数据要由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
实体有一个带有setter和getter的文本字段content
。
现在我想简单地为每个字段使用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'
))
// ...
答案 0 :(得分:1)
首先,我建议遵守使用JoinColumn()
注释的规则。例如:
/**
* @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,
])
}
// ...