首页 > 解决方案 > Symfony 形式大数据集

问题描述

对于 Symfony 4 项目,我们需要制作一个包含多个字段的大型inpection表单surfaces。我们正在寻找如何组织结构和关系并牢记加载速度的方法。

我创建了下面的基本实体示例,将其存储在一个数据库表中仍然很简单。下面的字段是简单的关系或字符串字段,因此 InspectionType 很容易。

class Inspection
{
    /** @var string */
    protected $projectName;

    /** @var string */
    protected $projectPlace;

    /** @var User */
    protected $inpector;

    /** @var Customer */
    protected $customer;

    /** @var string */
    protected $conclusion;

    /** @var string */
    protected $advice;

    // Complex part
    
    /** @var Collection */
    protected $surfaces;
}

现在是复杂的部分。每个检查可能包含一个或多个表面 (ArrayCollection)。每个表面由不同的字段组成,见下文:

  1. 文本类型
  2. 选择类型(单)
  3. 选择类型(多个)
  4. 日期类型
  1. 文本类型
  2. 图像(关系,OneToMany)
  3. 选择类型(单)

我的问题是如何设置surfaces和数据库结构,如果表面中的每个部分都具有如下表所示的表,并且与检查有关系(这会创建很多表,这很糟糕吗?):

我正在考虑创建一个嵌入集合表单,如下所示

class InspectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // ...

        $builder->add('surfaces', CollectionType::class, [
            'entry_type' => SurfaceType::class,
            'entry_options' => ['label' => false],
        ]);
    }
}

class SurfaceType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('leakage', LeakageTyoe::class);
        $builder->add('tension', Tension::class);
        $builder->add('slope', Slope::class);
        ...
    }
}

这是要走的路吗:)

标签: phpformssymfonysymfony4

解决方案


我建议为您的表面实体使用判别器/继承映射single_table,并制定策略。这为您提供了所需的速度和灵活性。


推荐阅读