php - 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)。每个表面由不同的字段组成,见下文:
- 屋顶表面(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);
...
}
}
这是要走的路吗:)
解决方案
我建议为您的表面实体使用判别器/继承映射single_table
,并制定策略。这为您提供了所需的速度和灵活性。
推荐阅读
- node.js - 使用 Express 从 ASP.NET Web API 到 Node.js
- css - 使用带有 LESS 函数的 CSS 自定义属性(变量)
- excel - 比较两个不同 Excel 工作表中的两列
- .htaccess - .htaccess 重定向以删除 php 并重定向到 https 和非 www
- python - 如何检查 ManyToMany 字段是否为空?
- tomcat - 在 ELB 后面启用 SSL 的 Tomcat
- oauth-2.0 - Kubernetes入口背后的授权服务器?
- flutter - 有状态的 Widget 子级未更新
- android - Android SQLiteAssetHelper 数据库无法打开
- php - 巨大的 CPU 负载 - php-fpm + nginx