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

基于Doctrine与Symfony:生成Fixture及迁移重命名数据

没问题,我来帮你搞定这两个步骤——先完善Fixture生成指定测试记录,再编写Migration完成批量重命名操作。

1. 完善Fixture代码生成10条测试记录

你原来的代码已经有了基础框架,我帮你补全并做了优化,避免因找不到parent记录导致的异常:

<?php

namespace App\DataFixtures;

use App\Entity\Category;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class AppFixtures extends Fixture
{
    public function load(ObjectManager $manager): void
    {
        // 循环生成10条Category记录,name为test0到test9
        for ($i = 0; $i < 10; $i++) {
            $category = new Category();
            $category->setName('test ' . $i);

            // 处理parent关联:如果找到对应ID的分类才设置,避免报错
            $parentId = mt_rand(89, 140);
            $parent = $manager->getRepository(Category::class)->find($parentId);
            if ($parent instanceof Category) {
                $category->setParent($parent);
            }

            $manager->persist($category);
        }

        $manager->flush();
    }
}

代码说明:

  • 循环$i从0到9,生成test 0到test 9(如果不需要空格可以改成test{$i})的名称
  • 增加了instanceof判断,避免当随机ID找不到对应Category时抛出异常
  • 最后调用flush()提交所有记录到数据库
2. 创建Migration批量重命名记录

接下来我们编写一个Doctrine迁移类,把所有名称以test 开头的Category记录,重命名为category 0到category 9:

首先通过命令生成迁移类:

php bin/console make:migration

然后打开生成的迁移文件(位于src/Migrations/VersionXXXXXXXXX.php),替换up和down方法为以下内容:

<?php

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

final class VersionXXXXXXXXX extends AbstractMigration
{
    public function getDescription(): string
    {
        return 'Rename testX category records to categoryX';
    }

    public function up(Schema $schema): void
    {
        // 使用SQL批量更新:匹配name以'test '开头的记录,替换前缀
        $this->addSql("
            UPDATE category 
            SET name = CONCAT('category ', SUBSTRING(name, 6)) 
            WHERE name LIKE 'test %'
        ");
    }

    public function down(Schema $schema): void
    {
        // 回滚操作:把category前缀改回test
        $this->addSql("
            UPDATE category 
            SET name = CONCAT('test ', SUBSTRING(name, 10)) 
            WHERE name LIKE 'category %'
        ");
    }
}

代码说明:

  • up方法:通过SQL的SUBSTRING截取test 后面的数字部分,拼接成category 开头的新名称
  • down方法:作为回滚操作,把category 前缀改回test ,确保迁移可以反向执行
  • 注意SUBSTRING的起始位置:test 是5个字符(t-e-s-t-空格),所以从第6位开始截取;category 是9个字符,所以从第10位开始截取

最后执行迁移生效:

php bin/console doctrine:migrations:migrate

内容的提问来源于stack exchange,提问作者Dialkord

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:31:33