现有数据库中的 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 扩展适用于 create 和 update 操作。因此,您可以通过将行的名称与其自己的名称一起模拟更新。
【讨论】:
来自文档“可更新(可选,默认=true)- true 更新 sluggable 字段更改的 slug,false - 否则”。所以如果名字没有改变,就不会被重新定义。 据我了解,Sluggable 不会比较 slugged 字段的两个版本,而是在更改该字段时触发。这意味着更新具有相同值的实体仍然是更新。以上是关于现有数据库中的 Symfony Doctrine Sluggable 扩展的主要内容,如果未能解决你的问题,请参考以下文章
Symfony,Doctrine 在存储到数据库之前截断 Json 中的字符串
Doctrine异常 - [Doctrine ORM Mapping MappingException]
在 Symfony 2 中使用 Doctrine 2 中的视图