【问题标题】:Symfony Doctrine Sluggable extension in existing database现有数据库中的 Symfony Doctrine Sluggable 扩展
【发布时间】: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;

【问题讨论】:

    标签: php symfony doctrine-orm slugify


    【解决方案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 字段的两个版本,而是在更改该字段时触发。这意味着更新具有相同值的实体仍然是更新。
      猜你喜欢
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多