Symfony 5 - Le schema_filter de Doctrine ne fonctionne pas correctement
P粉002023326
2023-08-26 18:16:28
<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>
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.
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.
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 erreurdatabase 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
anddoctrine: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 :
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
thendoctrine:migration:migrate
instead ofdoctrine: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