Wpis z mikrobloga

Witam mirków z #php i #symfony2 #symfony #webdev #webdevhelp
Mam w bazie danych tabelę user. Są już tam użytkownicy, teraz chcę dodać kolumnę slug, która musi być unikalna (będę tego używał do wyświetlania nazwy użytkownika w pasku adresu). W encji piszę takie coś:

/**
*
* @var string
*
* @Gedmo\Slug(fields={"name", "surname"}, updatable=true)
* @ORM\Column(name="slug", type="string", nullable=false, unique=true)
*/
protected $slug;

Kiedy jednak uruchamiam polecenie php app/console doctrine:schema:update --force, to zwraca mi błąd

[Doctrine\DBAL\Exception\UniqueConstraintViolationException]
An exception occurred while executing 'CREATE UNIQUE INDEX UNIQ_8D93D649989D9B62 ON user (slug)':
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '' for key 'UNIQ_8D93D649989D9B62'

Na pustej bazie danych jest ok, ale gdy jest conajmniej 2 użytkowników, w kolumnie są 2 takie same wartościslug (null), stąd jest ten błąd.
W jaki sposób mogę ustawić domyślną wartość w kolumnie slug, żeby wywołując polecenie php app/console doctrine:schema:update --force nie zwracałoby błędu?
  • 9
  • Odpowiedz
@poh: Uzupełniam slugi w taki sposób:

$this->addSql('UPDATE user SET slug = IF( name IS NULL AND surname IS NULL , SUBSTRING( MD5( RAND( ) ) FROM 1 FOR 16 ) , CONCAT( name, "-", surname ) ) WHERE slug = "";');
Ale dzięki za link :)
@lukasz_: Migracje mam zrobione, po prostu gdy wykrzacza się schema:update, to nie uzupełnia mi innych tabelek w bazie, przez co wykrzaczają się
  • Odpowiedz
@mariecziek: chodziło mi o to, że generalnie na produkcji nie używa się raczej schema:update tylko właśnie migracji. Powinieneś przygotować migrację która utworzy kolumnę "slug" (nie unique), następnie ją uzupełni po czym ustawi odpowiedni indeks unikalny.
  • Odpowiedz
@Jurigag: schema:update zmienia strukturę bazki na podstawie definicji tabel/kolumn w konfiguracji Doctrine.

Migracje to oddzielny mechanizm, który przy tym pozwala np zmigrować dane, a nie tylko strukturę.

Tak jak w przypadku kolegi – samo dostawienie kolumny nie wystarczy, potrzebne jest jeszcze uzupełnienie kolumny. Przy tym w dodatku dwuetapowo.

Jak masz jedno środowisko to możesz sobie takie rzeczy robić ręcznie, ale jak developerów jest kilku, środowiska testowe, produkcja => to migracje
  • Odpowiedz
@MacDada: z tym się zgodzę, ja jestem sam, na produkcji mam w sumie jedno środowisko, takze u mnie po prostu łatwiej i wygodniej stosować schema:update, ważne żeby robić backup przed taką operacją ( ͡° ʖ̯ ͡°)
  • Odpowiedz