Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 15-07-2007 09:31:31

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Zend_Db_Table jointure ?

En utilisant Zend_Db_Table. je n'ai pas trouvé de solution propre pour le pb suivant

2 tables exemple
table type_produit(id, libelle)
table produits(id,type_produit_id, description, prix). type_produit_id est une FK sur l'id de type_produit.

Comment faire pour faire une requete du genre en utilisant les objets ORM  fourni par zend_db_table?

select id, description, prix from table produits, type_produits
where type_produit_id = id and
libelle = 'kkchose' and
prix > 555


Je n'ai pas trouvé de solution propre sauf à définir une procédure spécifique dans la class produit via zend_db_select

Merci

Hors ligne

 

#2 15-07-2007 10:31:12

Cyrano
Membre
Lieu: Paris
Date d'inscription: 25-05-2007
Messages: 57
Site web

Re: Zend_Db_Table jointure ?

Je n'en ai pas encore fini l'exploration, mais il me semble que la solution est ICI

Dernière modification par Cyrano (15-07-2007 10:31:24)


Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends.
B. Franklin.

Hors ligne

 

#3 15-07-2007 10:49:11

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Zend_Db_Table jointure ?

Avant de poser la question, j'ai bien évidement lu la doc en long et en large.
Ne serait que pour créer mes classes de mapping sur les tables, j'étais obligé de passer par là.

A la fin, il y a ici des indications sur les jointures entre 2 ou 3 tables mais avec une clause where simplifiée à une seule contrainte. Dans ma question, hormis la jointure, il y a en a 2, une sur chaque table.

Dernière modification par TiTerm (15-07-2007 10:49:57)

Hors ligne

 

#4 15-07-2007 11:02:07

Cyrano
Membre
Lieu: Paris
Date d'inscription: 25-05-2007
Messages: 57
Site web

Re: Zend_Db_Table jointure ?

Désolé de ne pouvoir te donner une meilleure réponse pour le moment.
Ça souligne quand même un point : la doc est en fin de compte très (trop ?) basique hmm


Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends.
B. Franklin.

Hors ligne

 

#5 15-07-2007 11:45:32

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Zend_Db_Table jointure ?

Moi,  je trouve la doc relativement bien faite et assez complete. Simplement, il y a des moments ou on a des questions qui commence a être un peu plus avancé du fait meme que le ZF est ouvert et donc a des possibilité très large. La doc couvre le fonctionnement de base. De ce fait, je ne vois pas comment la doc pourrait couvrir toutes les possibilités offertes. De plus, je n'ai jamais utilisé d'ORM, je passe donc peut etre a coté de truc classique.

Hors ligne

 

#6 15-07-2007 11:50:38

Cyrano
Membre
Lieu: Paris
Date d'inscription: 25-05-2007
Messages: 57
Site web

Re: Zend_Db_Table jointure ?

Ce que je voulais dire, c'est que des éléments de base ont été oubliés et on doit chercher longtemps. Je viens de vivre le problème. C'est du reste toute la difficulté qu'il y a à concevoir une documentation. Basique ne doit pas vouloir dire sommaire et il ne faut pas oublier des détails. C'est certain que pour celui qui a développé, certains points sont au niveau de l'évidence, mais pour celui qui découvre le système, c'est une autre paire de manches.


Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends.
B. Franklin.

Hors ligne

 

#7 16-07-2007 18:11:52

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Zend_Db_Table jointure ?

Personne n'a une petite idée sur la question d'origine car le thread a dévié sur la doc mais ma question reste en suspend.

Hors ligne

 

#8 18-07-2007 10:44:52

yannux
Membre
Lieu: Rennes
Date d'inscription: 07-04-2007
Messages: 284
Site web

Re: Zend_Db_Table jointure ?

Euh un truc du genre ?

Code:

$select = $this->getAdapter()->select()
                ->from(array('a'=>'annonce'))
                ->join(array('ad'=>'annonce_data'),'ad.annonce_id = a.id', array('ad_id'=>'ad.id','content'))
                ->join(array('tt'=>'type_transaction'), 'tt.language = ad.language AND a.type_transaction = tt.id', array('tt_id'=>'tt.id'))
                ->join(array('tb'=>'type_bien'), 'tb.id = a.type_bien', array('tb_id'=>'tb.id','type_bien_title'=>'tb.title'))
                ->where('a.id = ?', $id)
                ->where('ad.language = ?', Zend_Registry::get('locale'));

Société : Direct Info Service

Hors ligne

 

#9 18-07-2007 11:51:06

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Zend_Db_Table jointure ?

Bah nan, c'est justement ce que je veux éviter. C'est ce que je fais actuellement dans une fonction dédié de l'objet qui map la table, mais je cherche comme faire qq chose d'équivalent en utilisant les fonctions natives de Zend_Db_Table.

Un peu comme les fonctions findDependentRowset(), findParentRow(), ou findManyToManyRowset().
peut etre en uilisant une combinaison des ces fonctions.

Mais j'ai de moins en moins l'impression que ce soit faisable.

Hors ligne

 

#10 18-07-2007 13:52:00

Cyrano
Membre
Lieu: Paris
Date d'inscription: 25-05-2007
Messages: 57
Site web

Re: Zend_Db_Table jointure ?

As-tu eu l'occasion de voir ce pdf ? Ça semble approcher pas mal de ce que tu cherches.


Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends.
B. Franklin.

Hors ligne

 

#11 18-07-2007 14:11:29

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Zend_Db_Table jointure ?

J'avais lu ca y a un moment.
Il y aurait peut etre qq chose a creuser dans cette direction, mais je ne pense pas que cela réponde a tout.
Au final, ca me semble plus lourd et plus spécifique que d'ajouter une procédure dédié dans l'objet produit.
Néanmoins, le pdf reste interessant.

Hors ligne

 

#12 18-07-2007 17:47:47

sam
Membre
Lieu: Nancy
Date d'inscription: 22-05-2007
Messages: 16

Re: Zend_Db_Table jointure ?

Moi j'ai fait ça, si ça peux t'aider.

Dans le contôleur :

Code:

$photos = new Photos();
$db = $photos->getAdapter();
$sql = "SELECT p.filename,a.date FROM photos AS p JOIN album_photos AS a on p.album_id=a.id";
$stmt = $db->query($sql);
$this->view->photos = $stmt->fetchAll();

Dans la vue :

Code:

<?php foreach($this->photos as $photo) : 
echo $this->escape($photo['filename'])."-".$this->escape($photo['date']);
endforeach;?>

Hors ligne

 

#13 18-07-2007 18:35:21

Cyrano
Membre
Lieu: Paris
Date d'inscription: 25-05-2007
Messages: 57
Site web

Re: Zend_Db_Table jointure ?

Là, on est carrément sorti de l'idée de l'ORM : en définissant la requête dans ta variable SQL, on perd tout l'intéret des objets modèles et du mapping ZF roll


Tu me dis, j'oublie. Tu m'enseignes, je me souviens. Tu m'impliques, j'apprends.
B. Franklin.

Hors ligne

 

#14 18-07-2007 22:08:00

TiTerm
Membre
Date d'inscription: 01-07-2007
Messages: 175

Re: Zend_Db_Table jointure ?

Bah en attendant mieux, je reste avec ma procédure dans l'objet.

ca donne qq chose comme ca

Code:

class CFDJ_Meta_Db_Meta extends Zend_Db_Table_Abstract {

....

    public function findMetaByPath($meta, $path = false) {
        $tables         = CFDJ_Meta_Init::getTables();
        $tableMeta      = $tables['Meta'];
        $tableTypeMeta  = $tables['TypeMeta'];
        $select = $this ->getAdapter()
                        ->select();
        $select ->from(array('m'=>$tableMeta), array('meta_path', 'meta_data','meta_id', 'meta_attributs', 'meta_class', 'meta_order', 'meta_publie'))
                ->join(array('t'=>$tableTypeMeta), 'm.meta_type_meta_id = t.type_meta_id', array('type_meta_libelle'))
                ->where('t.type_meta_libelle = ?',$meta)
                ->where('t.type_meta_publie = 1');
        if(!empty($path)) {
            $select->where('m.meta_path = ?', $path);
        }
        return $select->order('m.meta_order')
                      ->query()
                      ->fetchAll();
    }


....
}

Dernière modification par TiTerm (18-07-2007 22:12:00)

Hors ligne

 

#15 13-08-2009 12:27:31

abdelhafid
Nouveau membre
Date d'inscription: 13-08-2009
Messages: 1

Re: Zend_Db_Table jointure ?

Salut,
Je pense que ça respecte l'ORM :
public function findMetaByPath($meta, $path = false) {
        $tables         = CFDJ_Meta_Init::getTables();
        $tableMeta      = $tables['Meta'];
        $tableTypeMeta  = $tables['TypeMeta'];
        $select = $this->select();
        $select->setIntegrityCheck(false);
        $select ->from(array('m'=>$tableMeta), array('meta_path', 'meta_data','meta_id', 'meta_attributs', 'meta_class', 'meta_order', 'meta_publie'))
                ->join(array('t'=>$tableTypeMeta), 'm.meta_type_meta_id = t.type_meta_id', array('type_meta_libelle'))
                ->where('t.type_meta_libelle = ?',$meta)
                ->where('t.type_meta_publie = 1');
        if(!empty($path)) {
            $select->where('m.meta_path = ?', $path);
        }
        $select->order('m.meta_order')
        return $this->fetchAll($select);
    }

Hors ligne

 

#16 13-08-2009 16:30:11

itecman
Membre
Lieu: Orléans
Date d'inscription: 03-07-2009
Messages: 57

Re: Zend_Db_Table jointure ?

Salut,

Je suis aussi plongé dans le même secteur que toi, au niveau des tables, des relations entre tables et des requêtes. En lisant la doc sur la mise en place des relations entre "Model" (table donc), on trouve des trucs assez intéressants, et de ce que j'ai compris ta méthode findMetaByPath en devient même automatique.

Je te ramène au premier lien donné par Cyrano : http://framework.zend.com/manual/fr/zen … ships.html

Ici tu apprends que déjà à mettre les références entres les tables :

Code:

class Produits extends Zend_Db_Table_Abstract {

protected $_name = 'produits';
protected $_primary = 'id';

// Les références aux autres tables
$_referenceMap = arrray (
'Reference' => array ( 'columns' => 'type_produit_id', 
                                  'refTableClass' => 'Type_Produit',
                                  'refColumns' => 'id')
);
}

// Ton model des types de produits
class Type_Produit extends Zend_Db_Table_Abstract {

protected $_name = 'type_produit';
protected $_primary = 'id';

// A rajouter si t'as base ne géère pas lesz dépendances
protected $_dependentTables = 'Produits';

}

Code:

Note 
Si votre SGBD implémente le mécanisme des cascades, alors vous n'avez pas besoin de déclarer $_dependentTables. Voyez Section 8.6, « Opérations d'écritures en cascade » pour plus d'informations.

Sauf erreur à cette étape t'as tes tables avec les références entres elles. Prochaine étape d'après la doc tu peux  récupérer l'ensemble des produits correspondants à un type par exemple.

Tu devras forcément passer par les méthodes suivantes à un moment :

Code:

$row->findDependentRowset($table, [$rule]);

$row->findParentRow($table, [$rule]);

Aussi pour ta méthode, tu as la notion de "méthodes magiques" :

Code:

$row->find<TableClass>()

$row->find<TableClass>By<Rule>()

Qui pour toi pourront se traduire par : $row->findProduitByReference();
Fonction totalement gérée par ZF à partir donc de la déclaration de ta classe et des "roles".

Un exemple de code de la doc très parlant :

Code:

$accountsTable      = new Accounts();
$accountsRowset     = $accountsTable->find(1234);
$user1234   = $accountsRowset->current();
$select  = $accountsTable->select()->order('name ASC')->limit(3);
$bugsAssignedToUser = $user1234->findDependentRowset('Bugs','Engineer',$select);

Et je suppose que sur ton $select tu pourras peaufiner ta sélection...

Voilà, je pense vraiment que pour une solution "propre" cette méthodes te sera très utile. Maintenant regarde bien la doc, j'ai écris ça comme ça alors que je plonge juste dedans, mais ça me parait bien fait smile.

La doc de mikaelkeal que je te conseil (plus lisible et pratique à mon gout) : http://www.mikaelkael.fr/Zend-Framework … ation.html

Bye


-- itecman smile

ZF 1.8.4 - Zend Server CE

Hors ligne

 

#17 10-09-2009 05:08:26

lil-works
Membre
Date d'inscription: 10-09-2009
Messages: 40

Re: Zend_Db_Table jointure ?

Je comprend tout à fait ton problème TiTerm

Un des intérêts d'utiliser les bases de données avec jointure, est de pouvoir intégrer dans le WHERE des colonnes de toutes les bases liées.
Alors que les methodes:
find<TableClass>()
find<TableClass>By<Rule>()
ne s'applique que sur des lignes (rows)

Le problème c'est que la méthode findMetaByPath renvoi un Array et non un Rowset.

Voici peut être une piste interessante. En fait il n'est pas possible d'inclure des colonnes jointes. Par contre si on fait ça:
*on ne rentre pas de colonne a afficher array().
* $select = $this ->select(); a la place du getAdapter()
Les colonnes des tables jointes sont autorisée dans les WHERE ORDER & co

class CFDJ_Meta_Db_Meta extends Zend_Db_Table_Abstract {

....

    public function findMetaByPath($meta, $path = false) {
        $tables         = CFDJ_Meta_Init::getTables();
        $tableMeta      = $tables['Meta'];
        $tableTypeMeta  = $tables['TypeMeta'];
        $select = $this ->select();
        $select ->from(array('m'=>$tableMeta), array('meta_path', 'meta_data','meta_id', 'meta_attributs', 'meta_class', 'meta_order', 'meta_publie'))
                ->join(array('t'=>$tableTypeMeta), 'm.meta_type_meta_id = t.type_meta_id', array())
                ->where('t.type_meta_libelle = ?',$meta)
                ->where('t.type_meta_publie = 1');
        if(!empty($path)) {
            $select->where('m.meta_path = ?', $path);
        }
        return $select->order('m.meta_order')
                      ->query()
                      ->fetchAll();
    }


....
}

Dernière modification par lil-works (10-09-2009 05:44:07)

Hors ligne

 

#18 10-09-2009 06:35:10

lil-works
Membre
Date d'inscription: 10-09-2009
Messages: 40

Re: Zend_Db_Table jointure ?

En fait il y a
$select->setIntegrityCheck(false);

Qui finalement permet d'afficher les colonnes jointes.

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