2013-02-18 26 views
25

Gram w Symfony na moim serwerze internetowym i tworzę jednostkę z doktryną dla mojej bazy danych. Chciałem dodać kolumnę do jednego z tych jednostce ... Chciałem zrobić coś takiego:Dodaj kolumnę do istniejącego podmiotu w Symfony

php app/console doctrine:modify:entity 

Teraz wiem, że to polecenie nie istnieje, ale czy jest jakiś sposób (nie robiąc zupełnie migracji), aby po prostu dodać kolumnę.

P.S. Wiem, że mógłbym otworzyć plik php i dodać tekst tamtej kolumny, a następnie zaktualizować schemat, ale rozpowszechniam to dla niektórych klientów i podoba mi się bardziej "podobne do wiersza poleceń" podejście.

+2

Zrób to z kodu. Narzędzia generatora ORM nie powinny być w ten sposób nadużywane. – Ocramius

Odpowiedz

57

Faktycznie, stosując doktrynę nie ma sensu w ogóle coś zrobić tak jak sugeruje.

Doktryna jest ORM (mapowanie obiektowo-relacyjne) narzędzie. Oznacza to, że chcesz abstrakcyjnego bazy danych z listy Kod PHP, przekazujesz zawartość bazy danych do Doctrine Doctrine wykonuje wspaniałą pracę w tym obszarze:

Aby zachować aktualność swoich klientów/peerów za pomocą najnowszej wersji modelu, należy użyć Doctrine Migrations (http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html) W ten sposób można zarządzać aktualizacjami bazy danych, a ponadto daje pełną kontrolę nad tym, co należy zrobić podczas aktualizacji/obniżenia bazy danych. Można np. Ustawić wartości domyślne przed y dodaj FK.

Kroki dodając nową właściwość na klasie powinno być:

  • zmodyfikować klasę przez:

    • Acme \ MyBundle \ Entity \ Klienta i dodać właściwość chcesz;

      Acme\MyBundle\Entity\Customer

    • lub zmodyfikować plik nauką

      Acme/MyBundle/Resources/config/doctrine/customer.yml

  • uruchomić komendę konsoli (doda prawidłowego ustawienia/otrzymania w klasie)

    php app/console doctrine:generate:entities AcmeMyBundle:Customer

  • uruchomić komendę konsoli

    php app/console doctrine:migrations:diff

  • uruchomić komendę konsoli (będzie postawić nowy plik na app/DoctrineMigrations)

    php app/console doctrine:migrations:migrate

Podczas wdrażania nowa wersja kodu, wszystko co musisz zrobić, to zaktualizować kod źródłowy i uruchomić powyższe polecenie.

Dla Symfony 3:

  • zmodyfikować klasę przez:

    • Acme \ MyBundle \ Entity \ Klienta i dodać właściwość chcesz;

      Acme\MyBundle\Entity\Customer

    • lub zmodyfikować plik nauką

      Acme/MyBundle/Resources/config/doctrine/customer.yml

  • uruchomić komendę konsoli (doda prawidłowego ustawienia/otrzymania w klasie)

    php bin/console doctrine:generate:entities AcmeMyBundle:Customer

  • uruchomić komendę konsoli (baza aktualizacja)

    php bin/console doctrine:schema:update --force

+0

facet o niskiej reputacji próbował dodać to z edycją; Umieszczę to tutaj, ponieważ może to być pomocne: dla 'php bin/console doctrine: schema: update --force': WARNING [oficjalne dokumenty] (https://symfony.com/doc/current/doctrine.html# tworzenie-bazy-tabel-schematów) sugerują, że nie należy tego używać w środowisku produkcyjnym! – YakovL

0

Myślę, że musisz zaktualizować tabelę powiązań ręcznie, aby odwzorować relacje. Znalazłem: discussion

Ponownie, możemy generować jednostki z istniejącej bazy danych, jako całość, ale oddzielnie? :(

7

pewno chcesz otworzyć plik PHP/XML/yml, gdzie jednostka jest zdefiniowana i dodać tam kolumnę.Następnie, należy użyć poleceń, powiedzieć

console doctrine:schema:update 

ten sposób, swoje definicje podmiotu są zsynchronizowane z bazą danych i baza danych jest aktualizowana.

1

Znalazłem sposób, w którym dodałem nową kolumnę wewnątrz YourBundle/Resources/Config/doctrine/Yourentity.orm.yml.

Następnie dodano metody getter i setter wewnątrz klasy Entity.

Następnie zrobił php app/console doctrine:schema:update --force z konsoli. To zadziałało dla mnie.

2

Występuje pułapka na etapie php app/console doctrine:migrations:diff opisanym powyżej podczas korzystania z migracji doktryny.

Dokonano zmian w encji, wszystko wydaje się prawidłowe, ale polecenie dotyczące tworzenia migracji php app/console doctrine:migrations:diff mówi "Nie wykryto żadnych zmian w danych mapowania."

Nie można znaleźć miejsca, w którym znajduje się stara struktura bazy danych, szukaj w plikach nic nie znaleziono.

Dla mnie kluczem było wyczyszczenie pamięci podręcznej Redis.

php app/console redis:flushdb 

Zdarza powodu config.yml

snc_redis: 
    clients: 
     default: 
      type: predis 
      alias: default 
      dsn: redis://localhost 
    doctrine: 
     query_cache: 
      client: default 
      entity_manager: default 
      namespace: "%kernel.root_dir%" 
     metadata_cache: 
      client: default 
      entity_manager: default 
      document_manager: default 
      namespace: "%kernel.root_dir%" 
     result_cache: 
      client: default 
      namespace: "%kernel.root_dir%" 
      entity_manager: [default, read] # you may specify multiple entity_managers 

Po tym, migracje: Diff ponownego odczytania wszystkich podmiotów (zamiast podejmowania metadane nieaktualne te z pamięci podręcznej) i stworzył odpowiednią migrację.


Tak, cały łańcuch kroków dla podmiotów modyfikujących jest:

  1. Modyfikuj swoją klasę encji (edycja pliku Entity)
  2. Wyczyść Redis podręcznej metadanych (php app/console redis:flushdb)
  3. Create (i może być edytowana) migracja (php app\console doctrine:migrations:diff)
  4. Wykonanie migracji (php app\console doctrine:migrations:migrate)

Oczywiście pamięć podręczna metadanych twojej doktryny może nie być Redisem, ale czymś innym, np. Plikami w app/cache lub czymkolwiek innym. Nie zapomnij pomyśleć o czyszczeniu pamięci podręcznej.

Może pomóc komuś.

+0

Wow, to było nieoczekiwane, zwłaszcza, gdy 'cache: clear' nie rozwiązało problemu, ale kolor czerwony był taki. – antongorodezkiy

1

DLA UŻYTKOWNIKÓW SYMFONY3 ...

tutaj trzeba przestrzegać dwa kroki, aby dokonać zmian w swojej jednostce Krok 1: Otwórz Entity File..For EX: "Acme \ MyBundle \ Entity \ Book"

Aktualna jednostka ma kilka pól takich jak: id, nazwa, tytuł itp. Teraz, jeśli chcesz dodać nowe pole „obraz” i dokonać zmiany ograniczenie: „title” field następnie dodać pole z „obrazem” z getter i setter

/** 
    * @var string 
    * 
    * @ORM\Column(name="image", type="string", length=500) 
    */ 
    private $image; 

I dodać getter i setter

/** 
    * Set image 
    * 
    * @param string $image 
    * 
    * @return Book 
    */ 
    public function setImage($image) 
    { 
     $this->image = $image; 

     return $this; 
    } 

    /** 
    * Get image 
    * 
    * @return string 
    */ 
    public function getimage() 
    { 
     return $this->image; 
    } 

zaktualizować istniejące ograniczenia obszarze tytułu od długości 255 do 500

/** 
    * @var string 
    * 
    * @ORM\Column(name="title", type="string", length=500) 
    */ 
    private $title; 

Ok ... zostały wprowadzone zmiany w zależności od potrzeb, a ty krok.

Krok 2: Ogień to polecenie w katalogu projektu

php bin/console doctrine:schema:update --force 

Teraz, sprawdź tabelę w bazie danych, to się robi !!

0

Tak to pracował dla mnie:

  • dodawać nowe Vars ustawiające i pobierające wewnątrz istniejącej klasy:

    src -> AppBundle -> Entity -> YourClassName.php

  • zaktualizować plik ORM:

    src -> AppBundle -> Resources -> config -> nauka -> YourClassName.orm.yml

  • run komenda bash:

    php bin/doktryna konsola: schema: update --force

Powiązane problemy