IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Jointure qui ne fonctionne pas


Sujet :

Zend_Db PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2008
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 40
    Points : 18
    Points
    18
    Par défaut Jointure qui ne fonctionne pas
    Bonjour,

    Je souhaite utiliser les jointures SQL pour faire le traitement suivant

    Dans ma base de donnée j'ai 2 tables : blocks et blocks_interdit

    Dans blocks, j'ai le nom du blocks, sa position ...
    Dans blocks_interdit, j'ai le uniquement 2 champs : l'id du block + le nom du module

    Mon but : Afficher les blocks uniquement dans les modules autorisés.
    Par exemple, j'interdit le block "sondage" sur le module "index",
    je veux donc chercher les informations des blocks du module "index" en enlevant ceux qui sont cités dans la table blocks_interdit avec le module "index". Donc dans cet exemple, j'aurais tous les blocks sauf celui du sondage car il sera dans la table blocks_interdit

    Voilà ceux que j'ai fait mais ca ne marche pas, tous les blocks s'affichent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    		$select = $this->select();
    		$select->where("published = ?", 1); 
    		$select->order("ordering"); 
    		$select->join('blocks', 'blocks_interdit.bid = blocks.id AND blocks_interdit.module != '.$module.'');
    		$blocks = $this->fetchAll($select);
    Merci d'avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 118
    Points : 184
    Points
    184
    Par défaut
    Bonjour,

    Tu peux voir la chaine de caractère sous sa forme SQL généré par Zend_Db_Select pour debogage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // chaine SQL pour debug
    $sql = $select->__toString(); 
    Zend_Debug::dump($sql); exit;
    Il y a parfois des problèmes avec 'join', donc pour récupérer le résultat de la requête, il faut mieux faire appel à ton adapter explicitement que tu as définit dans ton bootstrap.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      $rowset = $this->getAdapter('db')->fetchAll($select);
    De plus les paramètres de ta jointure sont incohérent, commence par écrire proprement la requête en SQL et teste la, puis la traduire pour Zend_Dd_Select.

    Ne pas oublier 'joinleft' et 'joinright' qui évite la jointure croisée.
    Avec la syntaxe suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select->joinLeft(array('T2' => 'maTable2'), 'T1.Foreignkey = T2.primarykey', array('champ1', 'champ2'))
    Apprendre c'est se faciliter la vie !
    http://e-tuto.fr

  3. #3
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 497
    Points : 12 599
    Points
    12 599
    Par défaut
    En même temps ceci est tellement plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    $sql = '
    SELECT * 
    FROM bloks_interdit
        INNER JOIN bloks
            ON blocks_interdit.bid = blocks.id AND blocks_interdit.module != ?
    WHERE published = ?
    ORDER BY ordering ASC
    ';
     
    $this->getAdapter('db')->fetchAll($sql,array($module,1));

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    118
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2010
    Messages : 118
    Points : 184
    Points
    184
    Par défaut
    Je suis d'accord avec MaitrePylos, j'utilise plus volonté une bonne requête SQL qui est beaucoup plus compréhensible par tout le monde, lorsque la requête demande des jointures, etc...

    J'ai du réellement utiliser le Zend_Db_Select, pour un cas ou les jointures furent conditionnelles avec de multiple where sur une trentaine de tables pour une recherche multicritère.
    Apprendre c'est se faciliter la vie !
    http://e-tuto.fr

  5. #5
    Membre du Club Avatar de erehcab
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 215
    Points : 57
    Points
    57
    Par défaut
    Tu peux essayer d'ajouter cette ligne :

    $select->setIntegrityCheck(false);

    ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    $select = $this->select();
    $select->setIntegrityCheck(false);
    $select->where("published = ?", 1); 
    $select->order("ordering"); 
    $select->join('blocks', 'blocks_interdit.bid = blocks.id AND blocks_interdit.module != '.$module.'');
    $blocks = $this->fetchAll($select);

Discussions similaires

  1. Jointure qui ne fonctionne pas
    Par kcizth dans le forum SQL
    Réponses: 4
    Dernier message: 26/02/2008, 17h36
  2. Plein de jointures qui ne fonctionnent pas
    Par petchos dans le forum Langage SQL
    Réponses: 4
    Dernier message: 03/08/2007, 13h53
  3. jointure qui ne fonctionne pas
    Par zulot dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/06/2006, 14h53
  4. [SQL] Requête à jointure qui ne fonctionne pas
    Par Bensor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/12/2004, 16h10

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo