【发布时间】:2021-02-22 04:36:56
【问题描述】:
对于 Symfony 4 项目,我们需要制作一个包含多个字段的关于 surfaces 的大型 inpection 表单。我们正在寻找如何组织结构和关系并牢记加载速度的方法。
我创建了下面的基本实体示例,将其存储在一个数据库表中仍然很简单。下面的字段是简单的关系或字符串字段,因此 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 个字段);
- Dilation Rebellion(5 个字段);
- 烟囱(3 个字段);
- 分流箱(3 个字段);
- ...还有9个+;
我的问题是如何设置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);
...
}
}
这是要走的路吗:)
【问题讨论】:
标签: php forms symfony symfony4