IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Doctrine2 PHP Discussion :

[Data fixtures] Contraintes d'intégrité


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut [Data fixtures] Contraintes d'intégrité


    Me remettant à Sf2, je coince sur un problème : j'ai des entités avec des contraintes d'intégrité et des fixtures à y charger. Le problème, c'est que je ne peux pas simplement charger mes fixtures en vidant ma table, je ne peux que les ajouter à la fin...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ app/console doctrine:fixtures:load
      > purging database
     
      [PDOException]
     
      SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a tabl
    e referenced in a foreign key constraint (`symfony`.`category`, CONSTRAINT `cate
    gory_ibfk_1` FOREIGN KEY (`rubrique_id`) REFERENCES `symfony`.`rubrique` (`id`))
    Si j'ajoute le paramètre --append, ça fonctionne sans problème, mais ce n'est pas ce que je veux faire...

    Mon entité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
     
    namespace Quiz\QuizBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    /** 
     * @ORM\Entity
     */
    class LogCategory
    {
        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue
         */
        protected $id; 
     
        /**
         * @ORM\OneToMany(targetEntity="Log", mappedBy="category")
         */
        protected $logs;
     
        /**
         * @ORM\Column(type="string")
         *
         * Nom de la catégorie
         */
        protected $name; 
     
        public function __construct()
        {
            $this->logs = new ArrayCollection();
        }
     
        // getters et setters automatiquement définis
    }
    J'utilise MySQL 5.5 via PDO, Sf2 en beta 4 et Doctrine Data Fixtures Extension.

    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Apparemment, l'option append fait que tu ajoutes les données quand tu charges tes fixtures, au lieu de vider d'abord les tables puis charger les fixtures.

    Donc la requête Truncate est appelée par défaut pour vider les tables. Vu le log, il faut que puisses ordonner le vidage des tables car tu essayes de vider une table alors qu'une autre non vidée a encore une référence qui pointe vers la première.

    PS: il semble que tu vides ta table de catégories avant ta table de logs, or il y a une référence sur la colonne category.

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    tu essayes de vider une table alors qu'une autre non vidée a encore une référence qui pointe vers la première.
    Le problème, c'est que j'ai en tout et pour tout un seul enregistrement en base, la catégorie, dans la table sur laquelle je tente de lancer un TRUNCATE, justement !

    En passant, avec PhpMyAdmin, quand je fais un vidage de la table, les autres restant à zéro enregistrement, ça ne fonctionne pas non plus...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Cannot truncate a table referenced in a foreign key constraint (`symfony`.`log`, CONSTRAINT `log_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `symfony`.`logcategory` (`id`))
    Problème dans la définition d'une entité, donc dans le schéma de la base ?
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  4. #4
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Bizarre ! Problème de mapping sans doute... Est-ce que la requête qui plante (truncate ...) est juste ?

  5. #5
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2008
    Messages
    26 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2008
    Messages : 26 772
    Par défaut
    Citation Envoyé par pc.bertineau Voir le message
    Bizarre ! Problème de mapping sans doute... Est-ce que la requête qui plante (truncate ...) est juste ?
    C'est la même que produit phpMyAdmin et que je ferais moi sans ORM...

    Le mapping pour l'autre entité concernée, Log :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    <?php
     
    namespace Quiz\QuizBundle\Entity;
    use Doctrine\ORM\Mapping as ORM;
     
    /** 
     * @ORM\Entity
     */
    class Log
    {
        /**
         * @ORM\Column(type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue
         */
        protected $id; 
     
        /**
         * @ORM\ManyToOne(targetEntity="LogCategory", inversedBy="logs")
         */
        protected $category;
     
        /**
         * @ORM\ManyToOne(targetEntity="User", inversedBy="logs")
         */
        protected $who; 
     
        /**
         * @ORM\Column(type="integer")
         *
         * Identifiant de l'objet changé (type d'objet connu par la catégorie)
         */
        protected $what; 
     
        /**
         * @ORM\Column(type="object")
         *
         * Ancienne valeur
         */
        protected $old; 
     
        /**
         * @ORM\Column(type="object")
         *
         * Nouvelle valeur
         */
        protected $new; 
     
        // ...
    }
    Cette table étant vide. Un dump de ces deux tables par phpMyAdmin, au cas où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `log`
    --
     
    CREATE TABLE IF NOT EXISTS `log` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `category_id` int(11) DEFAULT NULL,
      `who_id` int(11) DEFAULT NULL,
      `what` int(11) NOT NULL,
      `old` longtext NOT NULL,
      `new` longtext NOT NULL,
      PRIMARY KEY (`id`),
      KEY `IDX_B7722E2512469DE2` (`category_id`),
      KEY `IDX_B7722E25F4E25B21` (`who_id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
     
    --
    -- Dumping data for table `log`
    --
     
     
    -- --------------------------------------------------------
     
    --
    -- Table structure for table `logcategory`
    --
     
    CREATE TABLE IF NOT EXISTS `logcategory` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` varchar(255) NOT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
     
    --
    -- Dumping data for table `logcategory`
    --
     
    INSERT INTO `logcategory` (`id`, `name`) VALUES
    (5, 'Édition de catégorie'),
    (6, 'Édition de quiz');
     
    -- --------------------------------------------------------
     
    --
    -- Constraints for table `log`
    --
    ALTER TABLE `log`
      ADD CONSTRAINT `log_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `logcategory` (`id`),
      ADD CONSTRAINT `log_ibfk_2` FOREIGN KEY (`who_id`) REFERENCES `user` (`id`);
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Par défaut
    Tiens, si jamais tu chercherais encore, voici une solution trouvée ici

    https://github.com/doctrine/data-fix...dd95482eeedf35

    En fait truncate marche pas encore super bien, alors le mieux c'est de revenir au dernier commit !

Discussions similaires

  1. Merise : Contrainte d'intégrite fonctionnelle
    Par new_wave dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 22/06/2022, 11h51
  2. contrainte d'intégrité super dur a gérer !
    Par RockLee69 dans le forum Oracle
    Réponses: 3
    Dernier message: 30/11/2005, 15h02
  3. Réponses: 5
    Dernier message: 26/10/2005, 14h43
  4. [debutant] Contraintes d'intégrité définies sur un objet
    Par maysa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 25/05/2004, 14h57
  5. Question sur les contraintes d'intégrités
    Par eGGyyS dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 27/04/2004, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo