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!
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
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: ~
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.
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.
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?
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
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
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