Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'utilise une table pour enregistrer des relations entre des agences et des metiers.
Voici mes deux tables :
metiers
+------+----------+ | uid + metier + +------+----------+ | 1 | metier 1 | +------+----------+ | 2 | metier 2 | +------+----------+ | 3 | metier 3 | +------+----------+ | 3 | metier 4 | +------+----------+
metiers_agences
+------------+------------+ | metiers_id + agences_id + +------------+------------+ | 1 | 5 | +------------+------------+ | 2 | 5 | +------------+------------+ | 3 | 5 | +------------+------------+ | 1 | 2 | +------------+------------+ | 1 | 4 | +------------+------------+ | 3 | 4 | +------------+------------+
Pour gérer ma relation entre les deux j'ai créer un model spécifique :
<?php class RelMetiersAgences extends Zend_Db_Table { /** * Le nom de la table * @var string */ protected $_name = 'metiers_agences'; public function renvoyerMetiersAgence($uidAgence) { $selectAgences = $this -> select() -> from($this -> _name, "metiers_id") -> where('`agences_id` = ?', (int) $uidAgence); $Rows = $this -> fetchAll($selectAgences); if ( sizeof($Rows) > 0 ) { foreach ($Rows AS $Row) { $Row = $Row -> toArray(); $Retour[] = $Row['uid']; } return $Retour; } else { return false; } } } ?>
Le problème c'est que dès que je créé une instance de ma relation j'obtiens le message suivant :
A table must have a primary key, but none was found
Bon, je peux très bien créer une clé primaire sur ma table pour éviter le message mais elle n'en a pas besoin.
Maintenant peut-être n'est-ce pas la bonne solution de créer une table pour la relation entre agences et métiers...
Merci pour vos lumières
Cordialement,
Kaimite
Hors ligne
Zend_Db_Table ne peut être utiliser uniquement sur des tables ayant des clés primaires.
Et perso, je ne crée pas de model pour ce genre de tables puisque je n'ai jamais besoin du contenu de cette table tout seul. Généralement il y a une jointure pour avoir les informations métier/agence avec.
Hors ligne
Si ton schéma le permet, tu peux mettre une clé sur les 2 colonnes (clé primaire composée).
Ca arrive dans les relations plusieurs à plusieurs.
Zend_Db_Table ne permet pas d'utiliser des tables sans clé primaire.
Hors ligne
Il faudrait ajouter une ligne pour spécifier la clé :
protected $_primary = ma_cle;
*
Dans ce cas je pense que ça devrait être :
protected $_primary = array(metiers_id,agences_id);
Bon travail
Hors ligne
Akis a écrit:
Et perso, je ne crée pas de model pour ce genre de tables puisque je n'ai jamais besoin du contenu de cette table tout seul. Généralement il y a une jointure pour avoir les informations métier/agence avec.
Admettons que je supprime une agence. Pour supprimer les relations metier / agence je vais simplement faire un :
DELETE FROM `metiers_agences` WHERE `agences_id` = 35
Peux t-on faire un DELETE sur 2 tables en même temps.
Sur la doc de ZF j'ai vue que la fonction delete() n'accepte qu'un seule paramètre : le WHERE
Désolé si la question parait bète mais je n'ai pas de connaissances très poussées en SQL.
Cordialement,
Kaimite
Hors ligne
normalement tu n'a pas à créer de Zend_Db_Table pour les table de relation nm
il te faut deux Z_D_T pour les deux tables metier et agence et ajouter une relation nm entre les deux
ZF te donne alors les moyen de récupérer tes petits sans avoir à créer une Z_D_T pour la table de relation.
si tu as vraiment besoin de cette Z_D_T tu mes une clef sur les deux colonnes comme le prévois la règles SQL
A+JYT
Hors ligne
sekaijin a écrit:
il te faut deux Z_D_T pour les deux tables metier et agence et ajouter une relation nm entre les deux
heuuu j'avoue que là j ne comprends pas trop Peux-tu me donner un peu plus d'infos ? ou un lien ?
Merci d'avance.
Cordialement,
Kaimite
Hors ligne
Je suis en train de regarder ça : http://framework.zend.com/manual/fr/zen … hips.html.
Si je capte rien je reviens vers vous
Hors ligne
regarde ici http://framework.zend.com/manual/fr/zen … ships.html
tu trouvera les détail
$metierTable = new Metier_Table(); $metierRowset = $metierTable->find(1234); $metier1234 = $metierRowset->current(); $agencesRowset = $metier1234->findManyToManyRowset('Agences_Table', 'metiers_agences', 'Metier_Table');
A+JYT
Hors ligne
sekaijin a écrit:
normalement tu n'a pas à créer de Zend_Db_Table pour les table de relation nm
il te faut deux Z_D_T pour les deux tables metier et agence et ajouter une relation nm entre les deux
ZF te donne alors les moyen de récupérer tes petits sans avoir à créer une Z_D_T pour la table de relation.
si tu as vraiment besoin de cette Z_D_T tu mes une clef sur les deux colonnes comme le prévois la règles SQL
A+JYT
Bonjour à tous,
Je remonte ce topic à la surface, car je voudrais m'inspirer des réponses données ici, mais j'ai 2 questions:
(Je travail avec le ZF 1.7.4, je pars du principe que les règles fonctionnent de la même façon).
1- Lorsque que j'adapte la ligne à mon code :
$agencesRowset = $metier1234->findManyToManyRowset('Agences_Table', 'metiers_agences', 'Metier_Table');
Le Zend me retourne une erreur:
Zend_Db_Table_Row_Exception' with message 'Match table must be a Zend_Db_Table_Abstract,
Je corrige cette erreur en créant une classe pour ma table d'association à laquelle j'ajoute les "referenceMap" qui vont bien pour que cela fonctionne.
--> Est-ce qu'il est correct de créer une class pour la table d'association qui ne sert qu'à ajouter les tables de références?
2- Toujours en essayant de suivre l'indication de sekaijin, donc de ne pas avoir de class pour la table d'association, quelle est la logique à utiliser pour ajouter une nouvelle relation?
Doit on récupérer un objet "row", insérer les valeurs de la table d'association et faire un save()?.
D'avance merci de m'avoir lu, et merci pour votre aide éventuelle...
Le Duc
Hors ligne
Pages: 1