问题描述
对于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)。 每个表面都包含不同的字段,请参见下文:
- 屋顶表面(4个字段);
- 文本类型
- 选择类型(单个)
- 选择类型(多个)
- 日期类型
- 泄漏(3个字段);
- 文本类型
- 图像(关系,一对多)
- 选择类型(单个)
- 张力(3个字段);
- 坡度(3个字段);
- 屋顶污染(3个字段);
- 损坏(5个字段);
- 镇流器(3个字段);
- 檐(3个字段);
- UprightWork (4个字段);
- 扩张叛乱(5个字段);
- 烟囱(3个字段);
- 分流箱(3个字段);
- ... 9个以上+;
我的问题是如何设置surfaces
和数据库结构,表面上的每个零件都应像下面这样在其表上具有与检查的关系(这会创建很多表,这不好吗?):>
- 表感染
- 表inpection_leakage
- 表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
策略。这样可以为您提供所需的速度和灵活性。