web-dev-qa-db-fra.com

Doctrine Symfony: schéma: la mise à jour ne fonctionne pas

J'ai un problème étrange: J'ai une application symfony 2.3 (avec sonata user) J'ai créé un paquet avec une entité - l'entité a été créée sans problème Puis j'ai dû modifier l'entité et maintenant il semble impossible de modifier le schéma:

Pour voir ce qui se passe, j'ai augmenté toutes les longueurs de chaîne avec +1

Le code d'entité (avec les annotations):

namespace Too\ConfigAppBundle\Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * ConfigApp
 *
 * @ORM\Table(name="ConfigApp")
 * @ORM\Entity(repositoryClass="Too\ConfigAppBundle\Entity\ActiviteRepository")
 */
class ConfigApp
{
    /**
     * @var integer $id
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string $nom
     *
     * @ORM\Column(name="nom", type="string", length=101, unique=true)
     */
    private $nom;

    /**
     * @var string $nomSlug
     *
     * @Gedmo\Slug(fields={"nom"}, updatable=true, separator="_")
     * @ORM\Column(name="nomSlug", type="string", length=101, nullable=true)
     */
    private $nomSlug;

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

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

    /**
     * @var datetime $cree_le
     *
     * @Gedmo\Timestampable(on="create")
     * @ORM\Column(name="cree_le", type="datetime")
     */
    private $cree_le;

    /**
     * @var datetime $modifie_le
     *
     * @Gedmo\Timestampable(on="update")
     * @ORM\Column(name="modifie_le", type="datetime")
     */
    private $modifie_le;

    ...

Maintenant voir le résultat de:

php app/console doctrine:schema:update --dump-sql

CREATE TABLE ConfigApp (id INT AUTO_INCREMENT NOT NULL, nom VARCHAR(100) NOT NULL, nomSlug VARCHAR(100) NOT NULL, email VARCHAR(150) NOT NULL, telephone VARCHAR(15) NOT NULL, cree_le DATETIME NOT NULL, modifie_le DATETIME NOT NULL, PRIMARYKEY(id)) DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE = InnoDB

Aucune des nouvelles longueurs n’est prise en compte: Par exemple, le nom de champ doit avoir une longueur de = 101, Mais dump-sql donne nom VARCHAR (100)!

Quelqu'un pourrait-il essayer de comprendre ce qui ne va pas? Merci!

EDIT: J'ai déjà essayé de vider le cache avec: * Php app/console doctrine: cache: clear-metadata * Php app/console cache: effacez * En supprimant tout le contenu du cache Dossiers

J'ai aussi essayé --dump-sql et --force.

Cela ne change rien du tout… .. S'il vous plaît, tout indice serait le bienvenu!

9
G. Trennert

Je viens de finir sur le même problème: le schéma ne se met pas à jour.

Notez que --force renvoie exactement la même chose que --dump-sql, la seule différence est que --force exécute le code SQL sur la base de données.

Bien que, dans mon cas, le problème ne soit pas dû au fichier .orm.xml. C'est parce que j'ai défini ceci dans le fichier config_dev.xml:

doctrine:
orm:
    metadata_cache_driver:
        type: memcached
        Host: localhost
        port: 11211
        instance_class: Memcached
    query_cache_driver:
        type: memcached
        Host: localhost
        port: 11211
        instance_class: Memcached
    result_cache_driver:
        type: memcached
        Host: localhost
        port: 11211
        instance_class: Memcached

Même quand je publie un salut souvent:

php app/console cache:clear

les données memcached ne sont pas vidées. J'ai donc dû redémarrer memcached, puis tout était à nouveau opérationnel!

Merci pour votre question, elle m’a amené au bon endroit dans mon cas.

UPDATE: comme Phil a suggéré plus haut, exécuter cette commande fait aussi l'affaire:

php app/console doctrine:cache:clear-metadata
10
Yvan

Il est possible que vous oubliez d'activer le mappage automatique Doctrine;

orm:
   #auto_mapping: true

Si le mappage automatique est désactivé (ou commenté comme ci-dessus), vous devez enregistrer manuellement les entités de chaque groupe.

orm:
   entity_managers:
      default:
         mappings:
            AcmeHelloBundle: ~
10
Saman Mohamadi

Essayez d’utiliser YAML au lieu de l’annotation par défaut lorsque vous exécutez 

php app/console doctrine:generate:entity

Ou au lieu de courir 

app/console doctrine:schema:update --force

Vous pouvez simplement créer manuellement votre table MySql, ce qui est une tâche très fastidieuse.

4
user2338925

je pense que c'est à cause de la doctrine: mappage: commande d'importation. Cette commande stocke le schéma d'une base de données existante dans des fichiers .orm.xml. Probablement, vous exécutez cette commande.

J'ai eu le même problème, il m'a fallu beaucoup de temps pour le découvrir.

1
psiess

J'ai trouvé la solution: Je ne l'avais pas vu auparavant, mais il y avait un dossier doctrine dans src\Too\ConfigAppBundle\Resources\config contenant un fichier appelé ConfigApp.orm.yml:

Too\ConfigAppBundle\Entity\ConfigApp:
    type: entity
    table: null
    repositoryClass: Too\ConfigAppBundle\Entity\ConfigAppRepository
    fields:
        id:
            type: integer
            id: true
            generator:
                strategy: AUTO
        nom:
            type: string
            length: '100'
        nomSlug:
            type: string
            length: '100'
        email:
            type: string
            length: '150'
        telephone:
            type: string
            length: '15'
        cree_le:
            type: datetime
            length: null
        modifie_le:
            type: datetime
            length: null
    lifecycleCallbacks: {  }

J'ai supprimé ce dossier et la mise à jour du schéma fonctionne à nouveau.

J'ai sûrement fait quelque chose pour générer ce dossier de doctrine, mais je ne sais pas ce qu'il en était - si quelqu'un pouvait me dire comment ce contenu est généré - et pourquoi?

1
G. Trennert

Comme j'utilisais le mappage .orm.yml-, le problème était que j'avais créé le dossier doctrine-, dans lequel les mappages yml étaient présents, sous le mauvais chemin. Je l'ai donc corrigé en déplaçant le dossier doctrine- dans le dossier config: ...\BundleName\Resources\config\doctrine\MyEntity.orm.yml

1
goulashsoup

Bien que certaines des réponses données par @rai et d'autres soient correctes, une suggestion supplémentaire pour la version de Symfony est égale ou supérieure à 3.0, veuillez utiliser bin/console à la place de app/console, comme indiqué ci-dessous.

bin/console doctrine:schema:update --force
0
SandMania

Tapez php app/console help doctrine:schema:update dans la CLI

 --dump-sql            Dumps the generated SQL statements to the screen (does no
t execute them).

...

 --force               Causes the generated SQL statements to be physically exec
uted against your database.

Alors essayez le --force au lieu de --dump-sql

Et voici la commande pour effacer le cache: 

php app/console cache:clear

N'oubliez pas d'utiliser le mot clé help devant un espace de nom de commande afin d'obtenir le message d'aide correspondant à cette commande.

J'espère que ça aide 

0
S.Thiongane