2016-07-20 2 views
2

Мне пришлось добавить в существующую сущность поле слива, чтобы убрать поле «имя». Но в этом объекте уже есть данные, и я не могу их удалить.Symfony Doctrine Sluggable extension в существующей базе данных

Я хотел бы создать консольный скрипт, который может удалять все мое поле «имя».

Я не знаю, как это сделать, потому что это не вводное, а просто обновление ...

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 ;) ...'); 
    } 
} 

«слизняк» поле в моей сущности:

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

ответ

1

Я нашел более простой способ. Вы можете, по-видимому, просто установить слизь вручную так. И он будет облагать нужным полем.

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

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

Это был мой ответ ... Но вы должны сделать свой slug url friendly => preg_replace и сделать его уникальным => query – Alsatian

+0

Но расширение Doctrine Sluggable уже позаботится об этом, верно? – Kevin

+0

Вы правы для уникальности, из документации: «иногда вам может потребоваться установить ее вручную, и т. Д., Если сгенерированная она не выглядит достаточно удовлетворительной. Sluggable обеспечит уникальность пули». Поэтому он будет проверять уникальность, но они не будут генерироваться, как в расширении (ниже, без пробела ...) – Alsatian

2

Sluggable расширение работает на обоих создать и обновление действий. Таким образом, вы можете просто имитировать обновление, поставив имя строки со своим собственным.

+0

Из документации "updatable (optional, default = true) - true, чтобы обновить slug на сменных изменениях поля, false - в противном случае". Поэтому, если имя не изменяется, оно не будет переопределено. – Alsatian

+0

Как я понимаю, Sluggable не сравнивает две версии пробитого поля, но вместо этого запускается, когда это поле изменяется. Значение обновления объекта с теми же значениями по-прежнему является обновлением. – systemasis

+0

Вы правы .. – Alsatian

0

Просто увидел, что Gedmo library documentation непосредственно отвечает на этот вопрос:

Регенерация слизняка

В случае, если вы хотите слизняк самовосстанавливаться на основе Sluggable полей, установите пробку на нуль ,

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

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

Таким образом, в вашем случае у вас есть только упорствовать сущность, ничего. Потому что $ slug уже null.

Смежные вопросы