Fügen Sie einer bestehenden Entität in Symfony eine Spalte hinzu

Lesezeit: 6 Minuten

Ich habe mit Symfony auf meinem Webserver herumgespielt und eine Entität mit Doktrin für meine Datenbank erstellt. Ich wollte einer dieser Entitäten eine Spalte hinzufügen … Ich wollte so etwas tun:

php app/console doctrine:modify:entity

Jetzt weiß ich, dass dieser Befehl nicht existiert, aber gibt es eine Möglichkeit (ohne eine vollständige Migration durchzuführen), einfach eine Spalte hinzuzufügen.

PS Ich weiß, dass ich die PHP-Datei öffnen und die Spalte dort textuell hinzufügen und dann das Schema aktualisieren könnte, aber ich verteile dies an einige Clients und mag einen eher “Befehlszeilen-ähnlichen” Ansatz.

  • Mach es mit Code. Die Generatorwerkzeuge des ORM sollten nicht so missbraucht werden.

    – Okramius

    18. Februar 2013 um 17:04 Uhr

Benutzer-Avatar
PR Ribeiro

Eigentlich macht die Verwendung von Doctrine überhaupt keinen Sinn, um so etwas zu tun, wie Sie es vorgeschlagen haben.

Doctrine ist ein ORM-Tool (Object-Relational Mapping). Das bedeutet, dass Sie die Datenbank von Ihrem PHP-Code abstrahieren möchten, Sie delegieren Datenbankkram an Doctrine. Doctrine leistet auf diesem Gebiet wunderbare Arbeit.

Da Sie Ihre Kunden/Peers mit der neuesten Version des Modells auf dem Laufenden halten möchten, sollten Sie die Doctrine Migrations ( http://symfony.com/doc/current/bundles/DoctrineMigrationsBundle/index.html ). Auf diese Weise können Datenbankaktualisierungen verwaltet werden. Darüber hinaus haben Sie die vollständige Kontrolle darüber, was beim Upgraden/Downgraden der Datenbank zu tun ist. Sie könnten zB Standardwerte setzen, bevor Sie den FK hinzufügen.

Die Schritte zum Hinzufügen einer neuen Eigenschaft in der Klasse sollten wie folgt sein:

Für Symfony2:

  • Ändern Sie die Klasse durch:

    • Acme\MyBundle\Entity\Customer und fügen Sie die gewünschte Eigenschaft hinzu;

      Acme\MyBundle\Entity\Customer

    • oder ändern Sie die Doktrindatei:

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

  • Führen Sie den Konsolenbefehl aus (er fügt das richtige Set/Get in der Klasse hinzu)

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

  • Führen Sie den Konsolenbefehl aus

    php app/console doctrine:migrations:diff

  • Führen Sie den Konsolenbefehl aus (es wird eine neue Datei auf app/DoctrineMigrations platzieren)

    php app/console doctrine:migrations:migrate

Wenn Sie die neue Version des Codes bereitstellen, müssen Sie lediglich den Quellcode aktualisieren und den obigen Befehl ausführen.

Für Symfony3:

  • Ändern Sie die Klasse durch:

    • Acme\MyBundle\Entity\Customer und fügen Sie die gewünschte Eigenschaft hinzu;

      Acme\MyBundle\Entity\Customer

    • oder ändern Sie die Doktrindatei:

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

  • Führen Sie den Konsolenbefehl aus (er fügt das richtige Set/Get in der Klasse hinzu)

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

  • Führen Sie den Konsolenbefehl aus (Datenbank aktualisieren)

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

  • ein Typ mit niedrigem Ruf hat versucht, dies mit einer Bearbeitung hinzuzufügen; Ich werde es hier setzen, da dies hilfreich sein kann: für php bin/console doctrine:schema:update --force: WARNUNG offizielle Dokumente schlagen vor, dass man dies nicht in der Produktionsumgebung verwenden sollte!

    – Jakow L

    3. August 2017 um 14:35 Uhr

  • Warum verwenden wir keine Migrationen für Symfony 3?

    – Leigh Bicknell

    16. April 2020 um 7:57 Uhr

Fügen Sie eine neue Spalte in der bestehenden Entität auf Symfony hinzu. Ich habe da das gleiche Problem. nachdem ich lange recherchiert habe sind da die besten lösungen.

Lösungsarbeit auf Symfony 4

Beispiel:

Blog-Entität, die bereits in einem erstellt wurde Name Spalte sind da und ich möchte hinzufügen Beschreibungsspalte. so einfach eingeben

php bin/console make:entity Blog

Nachdem Sie diesen Befehl ausgeführt haben, möchten Sie eine neue Spalte hinzufügen

Sie möchten auf jeden Fall die PHP/XML/YML-Datei öffnen, in der Ihre Entität definiert ist, und die Spalte dort hinzufügen. Dann verwenden Sie die Befehlszeile und sagen

console doctrine:schema:update

Auf diese Weise sind Ihre Entitätsdefinitionen mit der Datenbank synchron und Ihre Datenbank wird aktualisiert.

Es gibt eine Falle auf Schritt php app/console doctrine:migrations:diff oben beschrieben, wenn Doktrinmigrationen verwendet werden.

Sie haben Änderungen an der Entität vorgenommen, alles scheint gültig zu sein, aber der Befehl zum Erstellen von Migrationen php app/console doctrine:migrations:diff sagt “Keine Änderungen in Ihren Zuordnungsinformationen festgestellt.”

Und Sie können nicht finden, wo sich die alte Datenbankstruktur befindet, die Suche in Dateien hat nichts gefunden.

Für mich war der Schlüssel, den Redis-Cache zu leeren.

php app/console redis:flushdb

Es passiert wegen 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

Danach liest migrations:diff alle Entitäten erneut (anstatt veraltete Metadaten aus dem Cache zu nehmen) und erstellt die richtige Migration.


Die vollständige Schrittkette zum Ändern von Entitäten lautet also:

  1. Ändern Sie Ihre Entitätsklasse (Bearbeiten der Entitätsdatei)
  2. Löschen Sie den Redis-Cache der Metadaten ( php app/console redis:flushdb )
  3. Migration erstellen (und ggf. bearbeiten) ( php app\console doctrine:migrations:diff )
  4. Migration ausführen ( php app\console doctrine:migrations:migrate )

Natürlich ist Ihr Doktrin-Metadaten-Cache möglicherweise nicht Redis, sondern etwas anderes, z. B. Dateien in App/Cache oder irgendetwas anderes. Vergessen Sie nicht, über das Löschen des Caches nachzudenken.

Vielleicht hilft es jemandem.

Ich habe einen Weg gefunden, die neue Spalte in YourBundle/Resources/Config/doctrine/Yourentity.orm.yml hinzuzufügen.

Dann wurden Getter- und Setter-Methoden in der Entity-Klasse hinzugefügt.

Dann tat php app/console doctrine:schema:update --force von der Konsole. Es hat für mich funktioniert.

Benutzer-Avatar
Kunal

FÜR SYMFONY3-BENUTZER…

Hier müssen Sie zwei Schritte ausführen, um Änderungen an Ihrer Entität vorzunehmen. Schritt 1: Öffnen Sie Ihre Entitätsdatei..Für EX: “Acme\MyBundle\Entity\Book”

Die aktuelle Entität hat einige Felder wie: ID, Name, Titel usw. Wenn Sie nun ein neues Feld von “Bild” hinzufügen und eine Änderungsbeschränkung für das Feld “Titel” vornehmen möchten, fügen Sie das Feld “Bild” mit Getter und Setter hinzu

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

Und fügen Sie Getter und Setter hinzu

/**
     * 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;
    }

Um die vorhandene Feldbeschränkung des Titels von einer Länge von 255 auf 500 zu aktualisieren

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

Ok … Sie haben Änderungen nach Ihren Bedürfnissen vorgenommen, und Sie sind nur einen Schritt davon entfernt.

Schritt 2: Lösen Sie diesen Befehl im Projektverzeichnis aus

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

Überprüfen Sie jetzt Ihre Tabelle in der Datenbank, es ist fertig !!

Benutzer-Avatar
JoseMiguel

Wenn Sie einer vorhandenen Entität eine neue Feldeigenschaft hinzufügen müssen, können Sie make:entity verwenden

$ php bin/console make:entity

Klassenname der zu erstellenden oder zu aktualisierenden Entität

“existierende Einheit”

Neuer Eigenschaftsname (drücken, um das Hinzufügen von Feldern zu beenden):

Bezeichnung

Feldtyp (geben Sie ? ein, um alle Typen anzuzeigen) [string]:

Text

Kann dieses Feld in der Datenbank null sein (nullable) (ja/nein) [no]:

nein

Neuer Eigenschaftsname (drücken, um das Hinzufügen von Feldern zu beenden):

(Drücken Sie erneut die Eingabetaste, um zu beenden)

Informationen extrahiert aus https://symfony.com/doc/current/doctrine.html

1282810cookie-checkFügen Sie einer bestehenden Entität in Symfony eine Spalte hinzu

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy