recherche

Maison  >  Questions et réponses  >  le corps du texte

Symfony 5 - Le schema_filter de Doctrine ne fonctionne pas correctement

<p>Lorsque j'exécute la ligne de commande <code>doctrine:schema:update --force</code> dans mon projet, j'essaie d'ignorer deux entités comme celle-ci : </p> <pre class="brush:php;toolbar:false;">/*** @ORMEntity(readOnly=true) * @ORMTable(name="view_tableau_de_bord")*/ classe ViewTableauDeBord { //... }</pré> <p>Dans mon fichier de configuration doctrine.yaml : </p> <pre class="brush:php;toolbar:false;">doctrine : dbal : default_connection : par défaut Connexions: défaut: URL : '%env(resolve:DATABASE_URL)%' pilote : 'pdo_pgsql' version_serveur : '12' jeu de caractères : utf8 schema_filter : ~^(?!view_)~ # ...</pré> <p>Doctrine continue de générer toutes les entités et ma vue est dans <code>schema_filter</code>. Quelle est votre explication à cela ? C'est la première fois que j'utilise cette option dans un projet. </p> <p>Paramètres du projet :</p> <ul> <li>Symfony 5.4.14</li> <li>PHP 7.4.26</li> <li>Doctrine : orm : 2.13.3</li> <li>Théorie/Remarques : 1.13.3</li> <li>doctrine/package de doctrine : 2.7.0</li> <li>doctrine/package de migration de doctrine : 3.2.2</li> <li>symfony/doctrine-bridge:5.4.14</li> <li>Théorie/Périphérique de données : 1.5.3</li> </ul></p>
P粉002023326P粉002023326543 Il y a quelques jours613

répondre à tous(2)je répondrai

  • P粉186897465

    P粉1868974652023-08-27 17:01:05

    Une entité marquée du drapeau readOnly=true n'est plus suivie pour les mises à jour mais il est toujours possible d'insérer ou de supprimer des lignes, comme expliqué dans la documentation.

    La commande doctrine:schema:update prendra quand même en compte la table pour mettre à jour le schéma.

    Dans la réponse à la question "Ignorer les entités Doctrine2 lors de l'exécution de la mise à jour du gestionnaire de schéma" il existe 3 options valides pour ignorer les entités dans les mises à jour de schéma.

    répondre
    0
  • P粉455093123

    P粉4550931232023-08-27 14:04:02

    schema_filter

    schema_filter n'est pas fait pour "filtrer" l'entité mais pour filtrer la table de base de données de la conscience de la doctrine.

    Voici un exemple :
    En supposant que vous créez manuellement une table mise à jour à partir d'une tâche cronphp brute personnalisée appelée view_booking_by_customer_per_year, cette table n'est pas utilisée par votre code dans votre projet mais est utilisée pour l'analyse des données.

    C'est un exemple typique, vous ne souhaitez pas générer une telle requête à chaque fois que vous mettez à jour le schéma.

    DROP TABLE view_booking_by_customer_per_year; // NO I DONT WANT THIS

    Ainsi, en utilisant schema_filter, vous pouvez dire à la doctrine d'ignorer ce tableau dans son processus de validation et de mise à jour.

    Essayez de créer une table aléatoire en utilisant du SQL brut et utilisez doctrine:schema:validate. Il affichera une erreur database is not in sync. Une fois que je l'ai mis dans schema_filter, l'erreur ne se produit plus.

    Ça marche pour doctrine:migration:diff and doctrine:schema:update

    schema_ignore_class

    Cependant, si vous souhaitez éviter de générer des entités dans la base de données, vous pouvez le trouver à partir du lien dans la réponse d'Ernesto :

    schema_ignore_classes:
       - Reference\To\My\Class
       - Reference\To\My\OtherClass

    Fonctionne uniquement à partir de la version Doctrine 2.7. Vous pouvez trouver l'exemple complet ici : Ignorer les entités Doctrine2 lors de l'exécution de la mise à jour de Schema Manager

    Utilisez la migration de la doctrine

    Je vous conseille fortement d'utiliser doctrine:migration:diff then doctrine:migration:migrate instead of doctrine:schema:update pour effectuer des modifications sur la base de données. C'est ok pour les développeurs locaux, mais en production, c'est une très mauvaise pratique.

    https://symfony.com/bundles/DoctrineMigrationsBundle/current/index.html

    répondre
    0
  • Annulerrépondre