Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
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 :
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
Dernière modification par shadypierre (22-05-2010 15:57:24)
Hors ligne
Hello,
C'est bien la bonne syntaxe. Ceci doit être dans une classe étendant Zend_Db_Table_Abstract.
@+
Hors ligne
Je comprend pas pourquoi j'ai cette erreur :
Too few columns for the primary key
Quand je fais ceci :
$mapperExister = new Application_Model_ExisterMapper(); $exister = new Application_Model_Exister(); $mapperExister->find(array(1,3), $exister)
Une idée?
Hors ligne
Hello,
Il faudrait plus de détails notamment quand tu appelles le find() de la classe étendant Zend_Db_Table_Abstract
@+
Hors ligne
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 :
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() :
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
Hors ligne
Donc c'est normal que cela ne fonctionne pas
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) :
$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 :
$result = call_user_func_array(array($this->getDbTable(), 'find'), $id);
@+
Hors ligne
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
$result = call_user_func_array(array($this->getDbTable(), 'find'), $id);
Par contre je n'ai pas réussi sans pas trop grave au moins ça donne le résultat souhaité
Merci bcp à toi!
Hors ligne
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
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
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
$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
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
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