Symfony 5 - Le schema_filter de Doctrine ne fonctionne pas correctement
P粉002023326
P粉002023326 2023-08-26 18:16:28
0
2
538
<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粉002023326
P粉002023326

répondre à tous(2)
P粉186897465

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.

P粉455093123

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

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal