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)。
每个表面由不同的字段组成,如下所示:
- 屋顶表面(4 个字段);
- 文本类型
- 选择类型(单)
- 选择类型(多项)
- 日期类型
- 泄漏(3 个字段);
- 文本类型
- 图像(关系,OneToMany)
- 选择类型(单)
- 张力(3个字段);
- 斜率(3 个字段);
- 屋顶污染(3 个字段);
- 伤害(5 场);
- 镇流器(3 个字段);
- 屋檐(3 个字段);
- UprightWork(4 个字段);
- 扩张叛乱(5 个字段);
- 烟囱(3 个字段);
- 分流箱(3个字段);
- ... 9 个以上+;
我的问题是如何设置 surfaces
和数据库结构,表面中的每个部分是否应该像下面那样在 table 上与检查相关(这会创建很多 tables,这样不好吗?):
- table检查
- table inpection_leakage
- table inpection_tension
- ...
我正在考虑创建一个如下所示的嵌入收集表单
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
策略。这为您提供了所需的速度和灵活性。
对于 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)。 每个表面由不同的字段组成,如下所示:
- 屋顶表面(4 个字段);
- 文本类型
- 选择类型(单)
- 选择类型(多项)
- 日期类型
- 泄漏(3 个字段);
- 文本类型
- 图像(关系,OneToMany)
- 选择类型(单)
- 张力(3个字段);
- 斜率(3 个字段);
- 屋顶污染(3 个字段);
- 伤害(5 场);
- 镇流器(3 个字段);
- 屋檐(3 个字段);
- UprightWork(4 个字段);
- 扩张叛乱(5 个字段);
- 烟囱(3 个字段);
- 分流箱(3个字段);
- ... 9 个以上+;
我的问题是如何设置 surfaces
和数据库结构,表面中的每个部分是否应该像下面那样在 table 上与检查相关(这会创建很多 tables,这样不好吗?):
- table检查
- table inpection_leakage
- table inpection_tension
- ...
我正在考虑创建一个如下所示的嵌入收集表单
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
策略。这为您提供了所需的速度和灵活性。