You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TYPO3自定义命令无法写入sys_category数据库问题求助

TYPO3自定义分类迁移至sys_category的问题解决

核心问题原因

  1. Extbase持久层默认忽略手动指定的自增主键uid,它依赖数据库自增机制生成ID,因此用Repository->add()无法保留原uid
  2. 系统默认的sys_category Extbase模型未映射hidden、starttime等enableFields,直接赋值不会写入数据库

解决方案:直接使用数据库连接执行操作(最可靠)

跳过Extbase的ORM限制,用ConnectionPool直接执行插入/更新,既能保留原uid,也能完整写入所有字段:

use TYPO3\CMS\Core\Database\ConnectionPool;
use TYPO3\CMS\Core\Utility\GeneralUtility;

// 假设已获取原自定义分类记录$originalCategory
$insertData = [
    'uid' => $originalCategory->getUid(),
    'pid' => 123, // 替换为目标存储的页面ID
    'title' => $originalCategory->getTitle(),
    'description' => $originalCategory->getDescription(),
    'hidden' => $originalCategory->getHidden() ? 1 : 0,
    'starttime' => $originalCategory->getStarttime(),
    'endtime' => $originalCategory->getEndtime(),
    'crdate' => time(),
    'tstamp' => time(),
    // 按需添加其他需要迁移的字段
];

// 获取sys_category的数据库连接
$connection = GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionForTable('sys_category');

// 先检查目标uid是否已存在,避免插入冲突
if (!$connection->select(['uid'], 'sys_category', ['uid' => $insertData['uid']])->fetchOne()) {
    $connection->insert(
        'sys_category',
        $insertData,
        // 字段类型映射,保证数据写入正确
        [
            \PDO::PARAM_INT, // uid
            \PDO::PARAM_INT, // pid
            \PDO::PARAM_STR, // title
            \PDO::PARAM_STR, // description
            \PDO::PARAM_INT, // hidden
            \PDO::PARAM_INT, // starttime
            \PDO::PARAM_INT, // endtime
            \PDO::PARAM_INT, // crdate
            \PDO::PARAM_INT, // tstamp
        ]
    );
} else {
    // 如果uid已存在,执行更新操作
    $connection->update(
        'sys_category',
        $insertData,
        ['uid' => $insertData['uid']]
    );
}

若坚持使用Extbase模型操作(仅适用于无需保留原uid场景)

如果一定要用Repository,需要自定义映射enableFields的模型:

1. 创建自定义SysCategory模型

namespace YourVendor\YourExtension\Domain\Model;

use TYPO3\CMS\Extbase\Domain\Model\Category as BaseCategory;

class SysCategory extends BaseCategory
{
    protected bool $hidden = false;
    protected int $starttime = 0;
    protected int $endtime = 0;

    public function getHidden(): bool
    {
        return $this->hidden;
    }

    public function setHidden(bool $hidden): void
    {
        $this->hidden = $hidden;
    }

    public function getStarttime(): int
    {
        return $this->starttime;
    }

    public function setStarttime(int $starttime): void
    {
        $this->starttime = $starttime;
    }

    public function getEndtime(): int
    {
        return $this->endtime;
    }

    public function setEndtime(int $endtime): void
    {
        $this->endtime = $endtime;
    }
}

2. 配置模型映射(Configuration/Extbase/Persistence/Classes.php)

return [
    \YourVendor\YourExtension\Domain\Model\SysCategory::class => [
        'tableName' => 'sys_category',
        'properties' => [
            'hidden' => ['fieldName' => 'hidden'],
            'starttime' => ['fieldName' => 'starttime'],
            'endtime' => ['fieldName' => 'endtime'],
        ],
    ],
];

注意:即使配置了模型,手动设置uid依然会被Extbase忽略,因此这种方式无法保留原uid。

关键注意事项

  • 迁移前务必备份数据库,避免数据损坏
  • 确保原uid在sys_category表中唯一,否则插入会失败,需提前处理冲突
  • 因为保留了原uid,关联该分类的其他记录无需修改关联字段

内容的提问来源于stack exchange,提问作者Bernd Wilke πφ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 22:04:51