Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Db
Zend_Db Forum d'entraide pour le composant Zend_Db du Zend Framework (création de requêtes, abstraction, ORM etc.). Avant de poster -> FAQ Zend_Db.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/07/2011, 18h59   #1
Futur Membre du Club
 
Inscription : avril 2005
Messages : 87
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 87
Points : 15
Points : 15
Envoyer un message via MSN à arnolpourri
Par défaut Requete multi table

Hello a tous,
je viens de passer sous ZF, je galère pas mal...

De ce que j'ai pu lire, la connection est faite automatiquement (cad sans que l'on ai besoin d'écrire de code nul part dans le bootstrap ou le fichier index.php général) si l'on place les bonnes données dans le application.ini si tout est bien déclaré ou il faut bien sur.

Pour moi, ca marche pour l'instant, j'arrive a afficher les contenus des tables assez facilement par ->fetchAll(). Seulement, voila t-il pas que j'ai une dépendance entre 2 tables et qu'au lieu d'afficher les ID de la table dépendante, j'aimerais quand même avoir les libellés...

Donc, ce que j'ai fait pour commencer, c'est créer une fonction qui permet de récupérer tous les éléments de la table avec une jointure: ci-dessous la fonction de ma classe Ecoliers:
Code :
1
2
3
4
5
6
7
 
	public function getTousLesEcoliers()
	{
		$select->from('ecoliers')
    		   ->join('ecoles','ecoliers.id_ecolier=ecole.id_ecolier');
        return $this->fetchAll($select)->toArray();
	}
Dans mon controller, un appel classique dans mon indexAction:
Code :
1
2
3
 
$joueurs = new Joueurs();
$this->view->ecoliers = $ecoliers->getTousLesEcoliers();
Et donc, quand je teste, page blanche.....rien ne s'affiche...
Je suppose que ma requête est pourrie.........

Il m'arrive souvent que rien ne s'affiche lorsque je dois tester mon code...Donc si au passage quelqu'un pourrait me dire comment faire pour ne pas galérer pour debugger ZF, ce serait extrêmement gentil...

Pour info, je taff avec WAMP, je code avec eclipse (workspace directement dans le dossier www: je sais, c'est moche )

Voila, je vous remercie pour vos avis éclairé ! De mon coté, je prends tout bon conseil, parce que j'ai jamais autant galéré dans un projet PHP (LOL). Il faut dire aussi que c'est mon premier MVC, donc c'est un peu déroutant au début...
++
arnolpourri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 19h37   #2
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 678
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 678
Points : 1 041
Points : 1 041
Tu as deux méthodes pour récupérer les informations de deux tables ayant une liaison.

En utilisant :
Code :
protected $_referenceMap
ou/et
Code :
protected $_dependentTables
Regarde la documentation pour en savoir plus, mais en gros cela te permettra d'utiliser des méthode directement sur tes objets qui permettront de récupérer d'autres informations sur les tables dépendantes.

Sinon faire comme tu as voulu le faire en utilisant join, il y a d'ailleurs plusieurs type selon ce que tu veux récupérer.

Par contre dans ton modèle tu devrais avoir quelque chose de ce style, je suis pas sur que ça soit parfaitement bon n'ayant testé.

Code :
1
2
3
4
5
6
7
	public function getTousLesEcoliers()
	{
		$select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
	        			->setIntegrityCheck(false)
    		   			->join('ecoles','ecoliers.id_ecolier=ecole.id_ecolier');
        return $this->fetchAll($select)->toArray();
	}
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 19h00   #3
Futur Membre du Club
 
Inscription : avril 2005
Messages : 87
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 87
Points : 15
Points : 15
Envoyer un message via MSN à arnolpourri
Hello,
dsl j'ai pas eu le temps de répondre hier...

Alors j'ai fait différents tests et le mieux que j'ai pu avoir, c'est pas une page blanche (c'est déjà ça, LOL):
An error occurred
Application error

Aucune idée de ce qui peut poser problème...

Comme je commence carrément a en avoir marre, je vais vous montrer mon code tout simplement, je craque...lol

Je commence par mon bootstrap:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
<?php
 
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initAutoload() {
    	require_once 'Zend/Loader/Autoloader.php';
		$autoloader = Zend_Loader_Autoloader::getInstance();
		$autoloader->setFallbackAutoloader(true);
		return $autoloader;
    }
 
	/**
     * Initialize session
     *
     * @return Zend_View
     */
    protected function _initView()
    {
        // Initialize view
        $view = new Zend_View();
        $view->doctype('XHTML1_STRICT');
        $view->headTitle('Mon site web!!!');
        $view->headMeta()->appendHttpEquiv('Content-Type', 'text/html; charset=UTF-8');
        $view->headLink()->prependStylesheet('/pwp/public/css/site.css');
 
        // Add it to the ViewRenderer
        $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
        $viewRenderer->setView($view);
 
        // Return it, so that it can be stored by the bootstrap
        return $view;
    }
 
	/**
	 * @return Zend_Navigation
	 */
	protected function _initNavigation()  {
        $view = $this->bootstrap('layout')->getResource('layout')->getView();
		$config = new Zend_Config_Xml(APPLICATION_PATH . '/configs/navigation.xml', 'nav');
		$view->navigation(new Zend_Navigation($config));
	}
}
Ecoliers.php
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
<?php
 
class Ecoliers extends Zend_Db_Table
{
    protected $_name = 'Ecoliers';
 
	protected $_primary = 'id_ecolier';
 
    protected $_referenceMap    = array(
    	'ecolier' => array( 							// rôle
            'columns'           => array('id_ecole'),	// clé secondaire
            'refTableClass'     => 'Ecoles', 			// Table dépendante
            'refColumns'        => 'id_ecole' 			// Clé primaire de la table dep
        ));
 
    public static $tab = 'Ecoliers';
 
    public function ajoutEcolier($n, $i) {
    	 $row = $this->createRow();
         $row->nom_ecolier = $n;
         $row->id_ecole = $i;
         $row->save();
    }
 
	public function getTousLesEcoliers()
	{
		$select = $this->select(Zend_Db_Table::SELECT_WITH_FROM_PART)
	        			->setIntegrityCheck(false)
    		   			->join('ecoles','ecoliers.id_ecole=ecole.id_ecole');
        return $this->fetchAll($select)->toArray();
	}  
}
Le controller:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
<?php
 
class EcoliersController extends Zend_Controller_Action 
{
	public function init()
	{
		/* Initialize action controller here */
		$activeNav = $this->view->navigation()->findByController('index');
		$activeNav->active = true;
		$activeNav->setClass("active");
	}
 
    function indexAction()
    {
    	$this->view->title = "Liste des Ecoliers";
    	$ecoliers = new Ecoliers();
    	//$this->view->ecoliers = $ecoliers ->fetchAll();
    	$this->view->ecoliers = $ecoliers ->getTousLesEcoliers();
    }
}
mon index.php (même si je pense pas que le soucis soit la...)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
 
<?php
 
// Define path to application directory
defined('APPLICATION_PATH')
    || define('APPLICATION_PATH', realpath(dirname(__FILE__) . '/../application'));
 
// Define application environment
defined('APPLICATION_ENV')
    || define('APPLICATION_ENV', (getenv('APPLICATION_ENV') ? getenv('APPLICATION_ENV') : 'production'));
 
set_include_path(implode(PATH_SEPARATOR, array(
    realpath(APPLICATION_PATH . '/../library'),
    realpath(APPLICATION_PATH . '/../application/models'),
    get_include_path(),
)));
 
/** Zend_Application */
require_once 'Zend/Application.php';
 
// Create application, bootstrap, and run
$application = new Zend_Application(
    APPLICATION_ENV,
    APPLICATION_PATH . '/configs/application.ini'
);
 
$application->bootstrap()
            ->run();
Voila, j’espère que l'un d'entre vous pourra m'aider et m'expliquer ce qui ne va pas, je désespère...

D'avance, merci !!
++
arnolpourri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 20h14   #4
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 678
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 678
Points : 1 041
Points : 1 041
Il faudrait le message d'erreur complet
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 20h44   #5
Futur Membre du Club
 
Inscription : avril 2005
Messages : 87
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 87
Points : 15
Points : 15
Envoyer un message via MSN à arnolpourri
Je me doute, j'aimerais l'avoir aussi !!!
Pourtant j'ai créé mon projet avec ZF et il m'avait créé un errorController automatiquement...Il n'a pas l'air d’être appelé lors de la rencontre de l'erreur...
arnolpourri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 07h37   #6
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 678
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 678
Points : 1 041
Points : 1 041
Essaye d'ajouter zfdebug
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 19h05   #7
Futur Membre du Club
 
Inscription : avril 2005
Messages : 87
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 87
Points : 15
Points : 15
Envoyer un message via MSN à arnolpourri
Re,
j'ai toujours pas trouvé mon erreur, je n'avance pas beaucoup...

Après différents tests, je pense que c'est ma requête qui merde...

J'ai changé le code de ma fct getTousLesEcoliers par
Code :
1
2
3
4
5
 
    	$select = $this->getDefaultAdapter()->select()
    			  ->from('Ecoliers');
 
        return $this->fetchAll($select)->toArray();
Pouvez vous me confirmer que ce code est juste et qu'il devrait au moins m'afficher tous les enregistrements de ma table ?

Quand je met comme code:

Code :
return $this->fetchAll();
Cela fonctionne...


J'en conclus qu'il n'y a pas moyen dans mon cas de définir une requête...

D’où ma question: Faut-il que je définisse quelque chose de spécial comme adapter ?

Me suis-je trompé auparavant lorsque je disais :
Citation:
De ce que j'ai pu lire, la connection est faite automatiquement (cad sans que l'on ai besoin d'écrire de code nul part dans le bootstrap ou le fichier index.php général) si l'on place les bonnes données dans le application.ini si tout est bien déclaré ou il faut bien sur.
Merci
arnolpourri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 19h48   #8
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 678
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 678
Points : 1 041
Points : 1 041
Si tu es dans ton modele il faut utilise fetchAll() sinon pour recuperer l adapteur c est getAdapter()
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 19h52   #9
Futur Membre du Club
 
Inscription : avril 2005
Messages : 87
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 87
Points : 15
Points : 15
Envoyer un message via MSN à arnolpourri
J'ai bien compris...

Ce que je veux dire, c'est que ma requête ne marche pas, que j'y mette une jointure ou non !!!

Ma question, c'est :
Pourquoi mon select ne fonctionne pas ?
arnolpourri est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/08/2011, 20h03   #10
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 678
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 678
Points : 1 041
Points : 1 041
Où fais tu une jointure ?
Rien n'est expliqué on peut pas deviner.

En suite en regardant la documentation de Zend c'ets clairement expliquer comment faire une jointure.
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h50.


 
 
 
 
Partenaires

Hébergement Web