Submitted by ssm2017 on
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;
?>