[Résolu] utiliser une condition dependant d'un left join avec pdo

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

salut
je lance une bouteille à la mer car j'ai beau y passer des heures, je trouve pas.

enonce du probleme

je souhaite mettre à jour un de mes modules vers d7.
la partie qui me pose probleme est le search.

voici la table dans laquelle je fais une recherche liee à la table "users".
uid est l'uid correspondant dans la table "users"
UUID est une chaine de 36 caracteres.

============================================

|uid| UUID |

| 1 | 780d5233-ddd8-4f8d-87fa-2ad7e59edd75 |

je souhaite recuper le user correspondant en donnant au search la valeur de UUID.

avec drupal 6, j'utilise :

<?php
$find
= array();
       
// Replace wildcards with MySQL/PostgreSQL wildcards.
       
$keys = preg_replace('!*+!', '%', $keys);
       
$query = "SELECT u.name, u.uid FROM {users} AS u"
             
. " LEFT JOIN {d4os_ui_users} AS du ON du.UUID='%s'"
             
. " WHERE u.uid=du.uid";
       
$result = pager_query($query, 15, 0, NULL, $keys);
        while (
$account = db_fetch_object($result)) {
         
$find[] = array(
           
'title' => $account->name,
           
'link'  => url('user/'. $account->uid, array('absolute' => TRUE))
          );
        }
        return
$find;
?>

et avec d7 (sqlite), j'en suis à ;

<?php
$keys
= preg_replace('!*+!', '%', $keys);

 
$query = db_select('users', 'u')
          ->
fields ('u',
            array (
             
'name',
             
'uid',
            )
          );
 
$query->leftJoin('d4os_ui_users', 'du', 'du.UUID = :uuid', array(':uuid' => $keys));
 
$query->condition('u.uid', 'du.UUID', '=')
          ->
extend('PagerDefault')
          ->
limit(15);

 
$results = $query->execute();
  foreach (
$results as $result) {
   
$find[] = array(
     
'title' => $result->name,
     
'link'  => url('user/'. $result->uid, array('absolute' => TRUE))
    );
  }
  return
$find;
?>

et il me transforme ca en :

SELECT u.name AS name, u.uid AS uid FROM {users} u LEFT OUTER JOIN {d4os_ui_users} du ON du.UUID = :uuid WHERE (u.uid = :db_condition_placeholder_0)

donc je comprends pas comment utiliser non seulement les jointures mais en plus la methode "condition" car il me prend pas en compte ma condition.
il veut un "placeholder" mais ou mettre ca ?

question

quelqu'un a une idee pour me sortir de ce bourbier pour avoir en sortie la meme requete que sous d6 ?

===================================================================================================

Solution

Damz sur l'irc a pointé deux problèmes :
- u.uid=du.UUID ce qui est faux et la vraie condition est u.uid=du.uid
- la condition est inversée (je demande le test sur la jointure a la place de la condition finale)

donc le code qui fonctionne maintenant est :

<?php
  $find
= array();
 
$keys = preg_replace('!*+!', '%', $keys);

 
$query = db_select('users', 'u')
          ->
fields ('u',
            array (
             
'name',
             
'uid',
            )
          );
 
$query->leftJoin('d4os_ui_users', 'du', 'du.uid=u.uid');
 
$query->condition('du.UUID', array(':uuid' => $keys))
          ->
extend('PagerDefault')
          ->
limit(15);

 
$results = $query->execute();

  foreach (
$results as $result) {
   
$find[] = array(
     
'title' => $result->name,
     
'link'  => url('user/'. $result->uid, array('absolute' => TRUE))
    );
  }
  return
$find;
?>
Forum : 
Version de Drupal :