在现有数据库中使用Symfony Doctrine Sluggable扩展

3

我需要在一个已存在的实体中添加一个slug字段来将“name”字段转换成slug。但是这个实体中已经有数据了,我不能删除它们。

我想创建一个控制台脚本,可以将所有的“name”字段都转换成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;
3个回答

2

Sluggable扩展可以用于创建更新操作。因此,您可以通过将一行的名称与其自身相匹配来模拟更新。


从文档中得知,“updatable(可选,默认为true)- true表示在可转换字段更改时更新slug,false则不更新”。因此,如果名称未更改,则不会被重新定义。 - Alsatian
据我所知,Sluggable 不会比较两个 slug 字段的版本,而是在该字段被更改时触发。这意味着使用相同值更新实体仍然是更新。 - systemasis

2
我发现有一种更简单的方法。你可以手动设置slug,它会自动将所需字段转换为slug格式。
foreach ($regions as $region) {
     $region->setSlug($region->getName());

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

那是我的答案...但你必须使你的slug url友好 => preg_replace,并使其唯一 => query - Alsatian
但是Doctrine Sluggable扩展已经处理了这个问题,对吧? - Kevin
你对唯一性是正确的,根据文档:“有时您可能需要手动设置它,如果生成的内容不够满意等。 Sluggable将确保slug的唯一性。”因此它会检查唯一性,但它们不会像扩展中那样自动生成(小写、无空格...)。 - Alsatian

0

刚刚看到 Gedmo库文档直接回答了这个问题:

Regenerating slug

In case if you want the slug to regenerate itself based on sluggable fields, set the slug to null.

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

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

所以,在您的情况下,您只需要持久化实体,没有其他操作。因为$slug已经是null了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接