Symfony OneToOne 关系呈现唯一形式
Symfony OneToOne relation render unique form
我的实体包含太多字段和数据,无法由 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
实体有一个文本字段 content
,带有 setter 和 getter。
现在我只想为每个字段使用 textarea
呈现我的表单,最好的方法是什么?
目前,它们被呈现为 select
元素,我定义了一个 ContentBlockType
class with content 字段
// ...
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()
注解的规则。示例:
/**
* @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,
])
}
// ...
我的实体包含太多字段和数据,无法由 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
实体有一个文本字段 content
,带有 setter 和 getter。
现在我只想为每个字段使用 textarea
呈现我的表单,最好的方法是什么?
目前,它们被呈现为 select
元素,我定义了一个 ContentBlockType
class with content 字段
// ...
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()
注解的规则。示例:
/**
* @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,
])
}
// ...