现有数据库中的 Symfony Doctrine Sluggable 扩展

Posted

技术标签:

【中文标题】现有数据库中的 Symfony Doctrine Sluggable 扩展【英文标题】:Symfony Doctrine Sluggable extension in existing database 【发布时间】:2016-11-23 17:59:55 【问题描述】:

我必须在现有实体中添加一个 slug 字段来填充字段“名称”。但是这个实体中已经有数据了,我不能删除它们。

我想创建一个控制台脚本,它可以将我所有的“名称”字段都打断。

我不知道该怎么做,因为这不是插入,而只是更新...

class SlugCommand extends ContainerAwareCommand

    protected function configure()
    
        $this
            ->setName('generate:geo:slug')
            ->setDescription('Slug generation for GeoBundle ');
    

    protected function execute(InputInterface $input, OutputInterface $output)
    
        $em = $this->getContainer()->get('doctrine')->getManager();
        $regions = $em->getRepository('FMGeoBundle:Region')->findAll();

        if($regions === null)
            throw new Exception('No Region found');
        

        foreach($regions as $region)
            // ????? Generate the slug here ??
            $em->persist($region);
        

        $em->flush();
        $output->writeln('Slugs Generated ;) ...');
    

我的实体中的“slug”字段:

/**
 * @var string
 *
 * @ORM\Column(name="slug", type="string", length=255)
 * @Gedmo\Slug(fields="name")
 */
protected $slug;

【问题讨论】:

【参考方案1】:

刚刚看到Gedmo library documentation直接回答了这个问题:

再生蛞蝓

如果您希望 slug 基于 sluggable 重新生成自身 字段,将 slug 设置为 null。

<?php $entity = $em->find('Entity\Something', $id);
$entity->setSlug(null);

$em->persist($entity); $em->flush();

因此,在您的情况下,您只需要持久化实体即可,别无其他。因为 $slug 已经为空。

【讨论】:

【参考方案2】:

我找到了一个更简单的方法。您显然可以像这样手动设置 slug。它会削弱所需的领域。

foreach ($regions as $region) 
     $region->setSlug($region->getName());

     $this->em->persist($region);

【讨论】:

那是我的答案......但你必须让你的 slug url 友好 => preg_replace,并使其独一无二 => 查询 但是 Doctrine Sluggable 扩展已经解决了这个问题,对吧? 您是正确的,来自文档:“有时您可能需要手动设置它,如果生成的看起来不够令人满意。Sluggable 将确保 slug 的唯一性。”所以它会检查唯一性,但它们不会像在扩展中那样生成(较低,没有空格......)【参考方案3】:

Sluggable 扩展适用于 createupdate 操作。因此,您可以通过将行的名称与其自己的名称一起模拟更新。

【讨论】:

来自文档“可更新(可选,默认=true)- true 更新 sluggable 字段更改的 slug,false - 否则”。所以如果名字没有改变,就不会被重新定义。 据我了解,Sluggable 不会比较 slugged 字段的两个版本,而是在更改该字段时触发。这意味着更新具有相同值的实体仍然是更新。

以上是关于现有数据库中的 Symfony Doctrine Sluggable 扩展的主要内容,如果未能解决你的问题,请参考以下文章

Symfony,Doctrine 在存储到数据库之前截断 Json 中的字符串

Doctrine异常 - [Doctrine ORM Mapping MappingException]

使用doctrine从Symfony2中的外部数据库导入表

在 Symfony 2 中使用 Doctrine 2 中的视图

Symfony Entites import - 无需处理元数据类

“名称解析中的临时失败”:Symfony 5.3 使用 Doctrine 和 Docker 连接到 MariaDB