2016-07-20 11 views
2

Ich musste in eine existierende Entity ein Slug-Feld einfügen, um das Feld 'name' zu verschieben. Aber es gibt bereits Daten in dieser Entität und ich kann sie nicht löschen.Symfony Doctrine Sluggable Erweiterung in existierende Datenbank

Ich möchte ein Konsolenskript erstellen, das alle meine "Name" -Feld schlüsseln kann.

Ich weiß nicht, wie es zu tun, weil dies nicht eine Insertion ist aber nur ein Update ...

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

Das 'Slug' Feld in meiner Einheit:

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

Antwort

1

Ich fand einen einfacheren Weg. Sie können den Slug anscheinend einfach manuell so einstellen. Und es wird das benötigte Feld verschleppen.

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

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

Das war meine Antwort ... Aber Sie müssen Ihre Slug URL freundlich machen => preg_replace, und es einzigartig zu machen => Abfrage – Alsatian

+0

Aber die Doctrine Sluggable Erweiterung kümmert sich schon darum, oder? – Kevin

+0

Sie sind richtig für die Einzigartigkeit, aus der Dokumentation: "Manchmal müssen Sie es möglicherweise manuell einstellen, usw., wenn erzeugt wird, sieht nicht zufriedenstellend genug aus. Sluggable wird die Eindeutigkeit des Slugs gewährleisten." Es wird also auf Eindeutigkeit geprüft, aber sie werden nicht wie in der Erweiterung erzeugt (niedriger, ohne Leerzeichen ...) – Alsatian

2

Der Sluggable Erweiterung funktioniert sowohl erstellen und Update Aktionen. Daher könnten Sie einfach ein Update simulieren, indem Sie den Namen einer Zeile mit einem eigenen versehen.

+0

Aus der Dokumentation "aktualisierbar (optional, default = true) - true, um den Slug auf schlammbare Feldänderungen zu aktualisieren, falsch - sonst". Wenn sich der Name nicht ändert, wird er nicht neu definiert. – Alsatian

+0

Wie ich verstehe, vergleicht Sluggable nicht die beiden Versionen eines Slugged-Feldes, sondern wird ausgelöst, wenn dieses Feld geändert wird. Das Aktualisieren einer Entität mit den gleichen Werten ist immer noch eine Aktualisierung. – systemasis

+0

Sie haben Recht .. – Alsatian

0

Gerade gesehen, dass die Gedmo library documentation direkt auf diese Frage antwortet:

Regenerations Slug

Im Fall, wenn Sie die Schnecke wollen, sich zu regenerieren, basierend auf Sluggable Felder, stellen Sie die Schnecke auf null .

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

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

Also, Sie in Ihrem Fall müssen nur die Einheit bestehen bleiben, sonst nichts. Weil $ slug bereits null ist.