Bonjour,

Dès que j'applique des contraintes de validation sur des attributs de classe entité et que je fais une migration, les champs correspondants sont supprimés en base de données.

Exemple ave mon entité "Advert" :

...
use Symfony\Component\Validator\Constraints as Assert;
...
    /**
     * @ORM\OneToOne(targetEntity="App\Entity\Vehicle", inversedBy="advert", cascade={"persist", "remove"})
     * @ORM\JoinColumn(nullable=false)
     */
    /**
     * @Assert\Type(type="App\Entity\Vehicle")
     * @Assert\Valid()
     */
    private $vehicle;
...

Après migration, le champ "vehicle_id" a été supprimé de ma table "advert".

Si je supprime tous mes fichiers de migration, que je drop ma base de données et que je la recrée (annotation incluses), voici ce que j'obtiens comme fichier de migration :

<?php declare(strict_types=1);

namespace DoctrineMigrations;

use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;

/**
 * Auto-generated Migration: Please modify to your needs!
 */
final class Version20190104142743 extends AbstractMigration
{
    public function up(Schema $schema) : void
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');

        $this->addSql('CREATE TABLE advert (id INT AUTO_INCREMENT NOT NULL, vehicle_id INT NOT NULL, description LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME DEFAULT NULL, expires_at DATETIME NOT NULL, UNIQUE INDEX UNIQ_54F1F40B545317D1 (vehicle_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB');
        $this->addSql('CREATE TABLE fuel (id INT AUTO_INCREMENT NOT NULL, fuel VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB');
        $this->addSql('CREATE TABLE mark (id INT AUTO_INCREMENT NOT NULL, mark VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB');
        $this->addSql('CREATE TABLE photo (id INT AUTO_INCREMENT NOT NULL, advert_id INT DEFAULT NULL, name VARCHAR(255) NOT NULL, extension VARCHAR(255) NOT NULL, INDEX IDX_14B78418D07ECCB6 (advert_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB');
        $this->addSql('CREATE TABLE sort (id INT AUTO_INCREMENT NOT NULL, sort VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB');
        $this->addSql('CREATE TABLE vehicle (id INT AUTO_INCREMENT NOT NULL, sort_id INT NOT NULL, fuel_id INT NOT NULL, mark_id INT NOT NULL, manufacture_date DATETIME NOT NULL, INDEX IDX_1B80E48647013001 (sort_id), INDEX IDX_1B80E48697C79677 (fuel_id), INDEX IDX_1B80E4864290F12B (mark_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB');
        $this->addSql('ALTER TABLE advert ADD CONSTRAINT FK_54F1F40B545317D1 FOREIGN KEY (vehicle_id) REFERENCES vehicle (id)');
        $this->addSql('ALTER TABLE photo ADD CONSTRAINT FK_14B78418D07ECCB6 FOREIGN KEY (advert_id) REFERENCES advert (id)');
        $this->addSql('ALTER TABLE vehicle ADD CONSTRAINT FK_1B80E48647013001 FOREIGN KEY (sort_id) REFERENCES sort (id)');
        $this->addSql('ALTER TABLE vehicle ADD CONSTRAINT FK_1B80E48697C79677 FOREIGN KEY (fuel_id) REFERENCES fuel (id)');
        $this->addSql('ALTER TABLE vehicle ADD CONSTRAINT FK_1B80E4864290F12B FOREIGN KEY (mark_id) REFERENCES mark (id)');
    }

    public function down(Schema $schema) : void
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');

        $this->addSql('ALTER TABLE photo DROP FOREIGN KEY FK_14B78418D07ECCB6');
        $this->addSql('ALTER TABLE vehicle DROP FOREIGN KEY FK_1B80E48697C79677');
        $this->addSql('ALTER TABLE vehicle DROP FOREIGN KEY FK_1B80E4864290F12B');
        $this->addSql('ALTER TABLE vehicle DROP FOREIGN KEY FK_1B80E48647013001');
        $this->addSql('ALTER TABLE advert DROP FOREIGN KEY FK_54F1F40B545317D1');
        $this->addSql('DROP TABLE advert');
        $this->addSql('DROP TABLE fuel');
        $this->addSql('DROP TABLE mark');
        $this->addSql('DROP TABLE photo');
        $this->addSql('DROP TABLE sort');
        $this->addSql('DROP TABLE vehicle');
    }
}

J'ai beau faire des recherches, je ne trouve rien par rapport à cela.

Quelqu'un aurait une idée concernant la provenance du problème?

Merci d'avance.

4 réponses


Zul3s
Réponse acceptée

Peux-tu me dire plus sur ton problème car je comprend pas trop. D'après la migration généré, tu as bien la relation entre Advert et Vehicle

        $this->addSql('ALTER TABLE photo ADD CONSTRAINT FK_14B78418D07ECCB6 FOREIGN KEY (advert_id) REFERENCES advert (id)');

Il ne faut pas différencier les deux "commentaires" (annotations).

Donc utilises :

/**
     * @ORM\OneToOne(targetEntity="App\Entity\Vehicle", inversedBy="advert", cascade={"persist", "remove"})
     * @ORM\JoinColumn(nullable=false)
     *
     * @Assert\Type(type="App\Entity\Vehicle")
     * @Assert\Valid()
     */
    private $vehicle;
dubitoph
Auteur

Merci beaucoup pour ta réponse. Cependant, le problème reste identique :-(

J'ai l'impression que ça vient d'une configuration quelconque. J'ai donc relu la documentation concernant les validations et j'ai ajouté ceci dans le fichier framework.yaml :

 # config/packages/framework.yaml
framework :
    validation : { enable_annotations : true }

Malheureusement, la situation reste inchangée.

dubitoph
Auteur

Merci beaucoup pour ton aide!

Effectivement, tout étair rentré dans l'ordre en regroupant les annotations, désolé. Je me suis laissé perturbé en voyant les drop table dans le fichier. Mais en testant jusqu'au bout, tout est bien créé, sorry....