Symfony 表单大数据集

Symfony form large data set

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

我创建了下面的基本实体示例,将其存储在一个数据库中仍然很简单table。下面的字段是简单的关系或字符串字段,因此 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 和数据库结构,表面中的每个部分是否应该像下面那样在 table 上与检查相关(这会创建很多 tables,这样不好吗?):

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

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);
        ...
    }
}

是这样吗:)去

我建议为您的曲面实体使用 discriminator/inheritance map,并采用 single_table 策略。这为您提供了所需的速度和灵活性。