插入前检查列是否可为空?

问题描述 投票:0回答:1

TL;DR:我可以在持久化期间或之前检查字段是否可为空吗?

我目前正在尝试找到一种顺利的方法来实现“如果足够完整则插入条目”表单。

这个简化表是实体类“User”自动生成的表。 Phone 可以为空,其余部分在架构中不可为空。

<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">[email protected]</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。

现在的大问题是:更新当然会失败,因为如果不是所有不可为空的字段都填充了信息,后端就无法创建新实体。

因此我想知道是否有可能在任何插入之前动态检查字段是否可为空。

php doctrine-orm doctrine
1个回答
0
投票

感谢 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
的组合对于我的口味来说变得太复杂了。

© www.soinside.com 2019 - 2024. All rights reserved.