Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 11-07-2008 11:36:24

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

[1.5] A table must have a primary key, but none was found

Bonjour,

J'utilise une table pour enregistrer des relations entre des agences et des metiers.

Voici mes deux tables :

metiers

Code:

+------+----------+
| uid  +  metier  +
+------+----------+
|   1  | metier 1 |
+------+----------+
|   2  | metier 2 |
+------+----------+
|   3  | metier 3 |
+------+----------+
|   3  | metier 4 |
+------+----------+

metiers_agences

Code:

+------------+------------+
| 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 :

Code:

<?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 smile

Cordialement,
Kaimite

Hors ligne

 

#2 11-07-2008 12:20:03

Akis
Membre
Date d'inscription: 29-03-2008
Messages: 86
Site web

Re: [1.5] A table must have a primary key, but none was found

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

 

#3 11-07-2008 12:49:23

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [1.5] A table must have a primary key, but none was found

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

 

#4 11-07-2008 12:51:17

ziedb
Membre
Lieu: Tunis
Date d'inscription: 24-03-2008
Messages: 224

Re: [1.5] A table must have a primary key, but none was found

Il faudrait ajouter une ligne pour spécifier la clé :

Code:

protected $_primary = ma_cle;

*
Dans ce cas je pense que ça devrait être :

Code:

protected $_primary = array(metiers_id,agences_id);

Bon travail

Hors ligne

 

#5 11-07-2008 14:06:48

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] A table must have a primary key, but none was found

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 :

Code:

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

 

#6 11-07-2008 16:55:02

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

Re: [1.5] A table must have a primary key, but none was found

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

 

#7 11-07-2008 17:53:17

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] A table must have a primary key, but none was found

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 sad Peux-tu me donner un peu plus d'infos ? ou un lien ?

Merci d'avance.

Cordialement,
Kaimite

Hors ligne

 

#8 11-07-2008 18:01:58

Kaimite
Membre
Lieu: Marseille
Date d'inscription: 16-06-2008
Messages: 144
Site web

Re: [1.5] A table must have a primary key, but none was found

Je suis en train de regarder ça : http://framework.zend.com/manual/fr/zen … hips.html.
Si je capte rien je reviens vers vous smile

Hors ligne

 

#9 11-07-2008 18:03:43

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

Re: [1.5] A table must have a primary key, but none was found

regarde ici http://framework.zend.com/manual/fr/zen … ships.html
tu trouvera les détail

Code:

$metierTable        = new Metier_Table();
$metierRowset       = $metierTable->find(1234);
$metier1234          = $metierRowset->current();

$agencesRowset   = $metier1234->findManyToManyRowset('Agences_Table', 'metiers_agences', 'Metier_Table');

A+JYT

Hors ligne

 

#10 14-04-2011 11:41:12

LeDuc08
Membre
Date d'inscription: 23-02-2009
Messages: 22

Re: [1.5] A table must have a primary key, but none was found

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 :

Code:

$agencesRowset   = $metier1234->findManyToManyRowset('Agences_Table', 'metiers_agences', 'Metier_Table');

Le Zend me retourne une erreur:

Code:

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

 

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