TL;DR:我可以在持久化期间或之前检查字段是否可为空吗?
我目前正在尝试找到一种流畅的方式来实现"如果足够完整,则插入条目"表单。
此简化表是实体类"User"的自动生成表。电话可为空,其余部分在架构中不可为空。
<table>
<tr data-id="25">
<td><input type="text" data-property="FirstName">Alice</td>
<td><input type="text" data-property="LastName">Smith</td>
<td><input type="text" data-property="Mail">alice@example.org</td>
<td><input type="text" data-property="Phone"></td>
</tr>
... more populated rows and at the end one empty row for new entries
<tr data-id="*">
<td><input type="text" data-property="FirstName"></td>
<td><input type="text" data-property="LastName"></td>
<td><input type="text" data-property="Mail"></td>
<td><input type="text" data-property="Phone"></td>
</tr>
</table>
我有一个简单的 ajax 调用,如果任何输入字段发生更改,它会将数据属性、值和数据 ID 发送到后端。后端决定这是更新还是插入(data-id == *(并执行操作,如果它是插入,则返回新 id。
现在最大的问题是:当然,更新会失败,因为如果不是所有不可为空的字段都填充了信息,则后端无法创建新实体。
因此,我想知道是否有可能在插入之前动态检查字段是否可为空。
多亏了Cerad的提示,我可以编写一个似乎有效的函数!随意根据自己的喜好修改!
请注意,类名必须是完全限定的。我使用ShortName::class
作为我的解决方案。
public function getNonNullableFieldNames(EntityManagerInterface $EM, string $class_name)
{
$table_name = $EM->getClassMetadata($class_name)->getTableName();
$columns = $EM->getConnection()->getSchemaManager()->listTableColumns($table_name);
$nonnullable_fields = [];
foreach($columns as $col){
if($col->getNotnull()){
$nonnullable_fields[] = $col->getName();
}
}
return $nonnullable_fields;
}
我并不是特别为foreach循环感到自豪,但是array_map
和array_filter
的组合变得太复杂了,不适合我的口味。