Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 21-05-2010 17:39:33

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

[Résolu] Clé primaire sur deux colonnes

Bonjour à tous, sur une de mes tables la clé primaire est composé de deux colonnes, le probleme étant que je n'arrive pas à le spécifier dans mon model, j'ai mis ceci :

Code:

protected $_primary = array('idTaille','refProd');

La doc dit

soit une chaîne, dans le cas d'une clé sur une colonne, ou un tableau de chaînes pour une clé sur plusieurs colonnes (clé primaire composée).

mais il n'y a malheureusement pas d'exemple.

Merci d'avance pour votre aide wink

Dernière modification par shadypierre (22-05-2010 15:57:24)

Hors ligne

 

#2 21-05-2010 18:41:03

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Clé primaire sur deux colonnes

Hello,

C'est bien la bonne syntaxe. Ceci doit être dans une classe étendant Zend_Db_Table_Abstract.

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 21-05-2010 21:07:22

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [Résolu] Clé primaire sur deux colonnes

Je comprend pas pourquoi j'ai cette erreur :

Too few columns for the primary key

Quand je fais ceci :

Code:

$mapperExister = new Application_Model_ExisterMapper();
$exister = new Application_Model_Exister();
$mapperExister->find(array(1,3), $exister)

Une idée? sad

Hors ligne

 

#4 21-05-2010 21:31:07

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Clé primaire sur deux colonnes

Hello,

Il faudrait plus de détails notamment quand tu appelles le find() de la classe étendant Zend_Db_Table_Abstract

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#5 21-05-2010 23:04:04

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [Résolu] Clé primaire sur deux colonnes

Donc j'ai une table 'Exister' ayant pour clé primaire le couple 'refProd' et 'idTaille'.

J'ai la classe qui étend Zend_Db_Table_Abstract :

Code:

class Application_Model_DbTable_Exister extends Zend_Db_Table_Abstract
{
    // Nom de la table
    protected $_name = 'exister';
    // Clé primaire
    protected $_primary = array('refProd','idTaille');
    // Reference
    protected $_referenceMap = array(
        'RefProd' => array(
            'columns' => 'refProd',
            'refTableClass' => 'Produit',
            'refColumns' => 'refProd'
        ),
        'IdTaille' => array(
            'columns' => 'idTaille',
            'refTableClass' => 'Taille',
            'refColumns' => 'idTaille'
        )
    );
}

Une classe qui fait le mappage et qui défini la fonction find() :

Code:

    public function find($id, Application_Model_Exister $exister)
    {
        $result = $this->getDbTable()->find($id);
        if (0 == count($result)) {
            return;
        }
        $row = $result->current();
        $exister->setRefProd($row->refProd)
                ->setIdTaille($row->idTaille)
                ->setQuantite($row->quantite);
    }

Voila, et c'est donc ce find() que j'appelle dans le code donné précédemment

Merci bcp a toi big_smile

Hors ligne

 

#6 22-05-2010 10:17:55

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [Résolu] Clé primaire sur deux colonnes

Donc c'est normal que cela ne fonctionne pas smile

C'est l'appel à find() qui n'est pas bon : tu ne dois pas passer sous la forme d'un array mais de 2 paramètres (ou X si X colonnes dans ta clé primaire) :

Code:

$result = $this->getDbTable()->find(1, 3); // recherche la clé primaire 1-3
$result = $this->getDbTable()->find(array(1, 2), array(3, 4)); // recherche les clés primaires 1-3 et 2-4

Pour ne pas te compliquer un call_user_func_array devrait fonctionner :

Code:

$result = call_user_func_array(array($this->getDbTable(), 'find'), $id);

@+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#7 22-05-2010 15:57:09

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [Résolu] Clé primaire sur deux colonnes

Le call_user_func_array() fonctionne en effet (je ne connaisais meme pas l'existence de cette fonction ou vas tu chercher tous ça xD

Code:

$result = call_user_func_array(array($this->getDbTable(), 'find'), $id);

Par contre je n'ai pas réussi sans hmm pas trop grave au moins ça donne le résultat souhaité big_smile

Merci bcp à toi!

Hors ligne

 

#8 22-05-2010 18:26:45

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Résolu] Clé primaire sur deux colonnes

je n'ai pas compris pourquoi tu vais une méthode find pour le mapping ZF le fait tout seul
voici un code que j'utilise la classe pour la table

Code:

Class Adm_Model_User_Table extends Zend_Db_Table_Abstract {
   protected $_name = 'user';
   protected $_rowClass = 'Adm_Model_User_Row';
...

la classe pour les objets de la table

Code:

class Adm_Model_User_Row extends Fast_Db_Row {
   public $_data = array(
         'usr_id' => null, 
         'usr_ident' => null,
         'usr_pwd' => null, 
         'usr_name' => null,
         'usr_firstname' => null,
         'usr_mail' => '@my.dommain.com',
         'usr_begin_dt' => null,
         'usr_end_dt'   => null);
...

dans la définition de la table je donne le nom de la classe des objet contenus dans celle-ci
à partir de là dès qu'on fait un fetchRow fetchAll find etc. on obtient un objet de la classe en question.

la partie data est juste là pour l'intialisation par défaut
pour créer un user je fait

Code:

$user = $userTable->createRow();

cela crée un objet de la classe initialisé. je n'ai plus qu'à présenter un formulaire comme si l'objet venait de la base par un find.

bref le petit truc magique c'est juste de mettre

Code:

protected $_rowClass = 'Adm_Model_User_Row';

dans la définition de la classe table.

A+JYT

Dernière modification par sekaijin (22-05-2010 18:28:18)

Hors ligne

 

#9 22-05-2010 19:02:35

shadypierre
Membre
Date d'inscription: 24-03-2010
Messages: 617

Re: [Résolu] Clé primaire sur deux colonnes

En faite j'ai simplement repris la façon de faire du quickstat de ZF que j'ai modifié pour utilisé mes tables j'ai rien touché d'autre. Mais en effet ça semble plus simple comme tu as fait.

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages