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

PHP & Base de données Discussion :

[Doctrine] Probleme sur mise à jour


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut [Doctrine] Probleme sur mise à jour
    Bonjour,

    J'ai une table t1 liée à une table t2 sur le champs cle.
    Je fais la lecture de mon enregistrement sans soucis, j'affiche t1->* et t1->Cle->* sans problème.
    Je peux modifier ce que je veux dans t1 et faire un t1->save(), ce que je veux dans t2 et faire un t1->Cle->save() sans problème.

    Par contre si je modifie t1->cle, que je sauve et que je recharge t1 depuis la bdd pour afficher le contenu, j'ai bien t1->cle qui prend la nouvelle valeur mais t1->Cle->cle est toujours sur l'ancien enregistrement.

    Si je rafraichi la page pour l'afficher alors t1->cle est bien égal à t1->Cle->cle.

    Je n'ai activé aucun cache dans Doctrine.

    Il y a donc semble t'il un problème de rafraichissement des liaisons et je n'arrive pas à contourner cela (pour que ça marche, j'enregistre, je balance un header de redirection sur ma page et je colle un die... c'est pas très propre !)

    Si quelqu'un à une piste, je suis preneur !

  2. #2
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    Quant tu fais la modification de T1->cle, pourrais-tu être plus précis sur le code utilisé.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Effectivement, je ne suis peut-être pas très précis et même un peu faux !
    Je vais tâcher de faire mieux avec un exemple

    J'ai une table bidon dont la classe de définition est la suivante :

    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
     
    abstract class BaseBidon extends Doctrine_Record {
        public function setTableDefinition() {
            $this->setTableName('bidon');
            $this->hasColumn('id', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0,
                 'unsigned' => false,
                 'primary' => true,
                 'sequence' => 'bidon_id',
                 'length' => '4',
                 ));
            $this->hasColumn('cle', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0,
                 'unsigned' => false,
                 'notnull' => false,
                 'primary' => false,
                 'length' => '4',
                 ));
        }
     
        public function setUp()
        {
            parent::setUp();
            $this->hasOne('Cle', array(
                 'local' => 'cle',
                 'foreign' => 'id'));
        }
    }
    Après, j'ai une table cle dont la classe est :

    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
     
    abstract class BaseCle extends Doctrine_Record {
        public function setTableDefinition() {
            $this->setTableName('cle');
            $this->hasColumn('id', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0,
                 'unsigned' => false,
                 'primary' => true,
                 'sequence' => 'cle_id',
                 'length' => '4',
                 ));
        }
     
        public function setUp()
        {
            parent::setUp();
            $this->hasMany('Bidon', array(
                 'local' => 'id',
                 'foreign' => 'cle'));
        }
    }
    En supposant que dans bidon j'ai les valeurs (1,1), (2,2), (3,3), etc.
    et que dans cle j'ai les valeurs 1, 2, 3, 4...

    Dans mon code, je fais, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $info = Doctrine::getTable('Bidon')->find(3);
    var_dump (array ($info->id, $info->cle, $info->Cle->id);
    $info->cle=2;
    $info->save();
    $info = Doctrine::getTable('Bidon')->find(3);
    var_dump (array ($info->id, $info->cle, $info->Cle->id);
    J'obtiens comme résultat pour le 1er var_dump : 3,3,3
    et pour le second var_dump : 3,2,3

    Si je fais un F5 dans FF, j'obtiens alors :
    pour le 1er var_dump: 3,2,2
    et pour le second var_dump : 3,2,2

    Ce qui veut dire qu'il a bien fait la modification dans la bdd (d'ailleurs phpmyadmin me le confirme) mais que le nouveau find() n'a pas été rechercher les informations de la table cle liée à la table bidon.

    J'espère que cela sera plus clair comme ça, je ne sais pas trop comment expliquer.

    J'ai oublié de préciser que l'application semble (je n'en suis pas l'initiateur et, comme d'hab, les librairies incluses ont subit un "nettoyage" déplorable...) utiliser doctrine 1.2.2 (numéro de version trouvé dans le Core.php)

  4. #4
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Points : 8 486
    Points
    8 486
    Par défaut
    La ligne de code :
    $info->cle=2;
    ne correspond pas à un code utilisable par Doctrine.

    De plus ton lien a le même nom que ton champ, ce qui fait qu'il n'est pas possible à doctrine de savoir si tu utilises le champs ou le lien.

    Donc modifie la définition de ta table BaseBidon ainsi
    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
     
    abstract class BaseBidon extends Doctrine_Record {
        public function setTableDefinition() {
            $this->setTableName('bidon');
            $this->hasColumn('id', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0
                 'primary' => true,
                 'sequence' => 'bidon_id',
                 'length' => '4',
                 ));
            $this->hasColumn('cle_id', 'integer', 4, array(
                 'type' => 'integer',
                 'fixed' => 0,
                 'length' => '4',
                 ));
        }
     
        public function setUp()
        {
            parent::setUp();
            $this->hasOne('Cle', array(
                 'local' => 'cle_id',
                 'foreign' => 'id'));
        }
    }
    Il faudra modifier la liaison dans l'autre table.

    Ainsi tu peux soit définir la clef directement
    $info->setCleId(2);
    Variantes
    $info['CleId'] = 2;
    $info->__set('CleId', 2);

    Soit avoir l'objet qui correspond à l'objet Cle pour l'id = 2 on va l'appeler $CleDeux
    Dans ce cas tu peux faire la liaison par
    $info->setCle($CleDeux);

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Hum... j'ignorai cela.
    Il faut dire que je débute avec Doctrine mais ça à l'air bien sympa.
    Je crois que je vais approfondir un peu.

    Je vais modifier le code comme tu me l'as indiqué. Cela dit, ça me fait un peu peur car dans toute l'application ils ont fait des $tbl->champ = valeur
    C'est d'ailleurs pour ça que j'ai utilisé cette notation.

    Merci beaucoup, je ne comprenais vraiment pas ce qui pouvait clocher.

    Je fais la modif et je teste. Si c'est ok (y'a pas de raison que cela ne le soit pas !) je modifie le sujet pour le mettre résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Probleme sur mise a jour d'une reference Web Service (VS2015 Community)
    Par Uttam dans le forum Services Web
    Réponses: 1
    Dernier message: 25/11/2016, 19h13
  2. [AC-97] Probleme sur mise à jour de graphique
    Par isa911Bis dans le forum IHM
    Réponses: 8
    Dernier message: 15/11/2010, 14h14
  3. Probleme de mise à jour et de modification d'une base
    Par flambo88 dans le forum Requêtes
    Réponses: 17
    Dernier message: 07/12/2005, 14h27
  4. Probleme de mise à jour de mes Edit Box
    Par bibi_64 dans le forum MFC
    Réponses: 2
    Dernier message: 02/11/2005, 22h49
  5. probleme de mise à jour de BD
    Par k_boy dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 30/05/2004, 21h58

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