0

我遇到了以下问题:

#1470230767 TYPO3\CMS\Extbase\Persistence\Generic\Storage\Exception\SqlErrorException
列 'linked_module' 不能为空

我有一个具有此属性的域模型:

/**
 * @var Module|null
 */
protected ?Module $linkedModule = null;

模块只是另一个领域模型,这个值不是强制性的。数据库定义如下所示:

linked_module   int(11) unsigned DEFAULT '0' NOT NULL,

最后但并非最不重要的相关 TCA:

config => [
    'autoSizeMax' => 1,
    'default' => 0,
    'eval' => 'int',
    'foreign_table' => 'tx_psbriskassessment_domain_model_module',
    'items' => [
        ['---', 0],
    ],
    'maxitems' => 1,
    'minitems' => 0,
    'renderType' => 'selectSingle',
    'size' => 1,
    'type' => 'select',
]

在我的控制器的一个动作中,我想重置这个属性的值:

$module->setLinkedModule(null);
$this->moduleRepository->update($module);

这引发了异常(见本文开头)。我正在使用TYPO3 v11.5.4并假设 DataMapper 会将 NULL 转换为 0,因为 eval=int。但这不会发生。

EXT:extbase/Classes/Persistence/Generic/Backend.php我深入核心并在(第 295 行)中找到了函数 persistObject( )。如果我正确阅读了代码,NULL 值总是作为 NULL 传递给数据库——此时无法进行转换。

我敢肯定,我只是错过了一个简单的点。在数据库服务器上禁用严格模式对我来说是没有选择的。必须有一个干净的解决方案。

4

1 回答 1

0

null与 0 不同。该关系可能与 UID 为 0 的记录有关(这是不寻常的,但不是设计禁止或阻止的)。

因此,将未设置的关系 ( $linkedModule = null) 自动转换为整数 0 会伪造信息。

最简单和最干净的方法应该是定义与您的模型匹配的数据库:没有默认值 0,而是可以为空。

linked_module   int(11) unsigned,
于 2021-12-16T20:04:00.377 回答