Ajouter une Table de Jointure, Où, et de l'Ordre Par des Vues de la Requête en views_query_alter()
Je suis en train de modifier la requête pour les Vues dans Drupal (Vues de la version 3, Drupal version 7).
Ce que je veux faire est de changer la requête avant l'exécution telles que la GAUCHE se Joint à une table dans laquelle j'ai coefficients de pondération attribués aux nœuds.
Si je devais écrire la requête que je veux en SQL, il devrait ressembler à ceci:
SELECT a.nid, a.title, a.description
FROM node a
LEFT OUTER JOIN node_weights b
ON a.nid = b.nid
WHERE b.uid = $uid
ORDER BY b.weight DESC
Cette requête fonctionne comme un champion quand je le lance dans l'analyseur de requêtes. Donc, maintenant, j'ai besoin pour le faire fonctionner dans mon module.
J'ai vu plusieurs approches détaillées sur les différents blogs pour les différentes manières de modifier des requêtes d'Affichage, mais ils semblent être en train de traiter les différentes versions de Vues. Donc, il est très déroutant pour essayer de déterminer si quelque chose, je suis à la recherche pourrait même éventuellement travailler pour mon application.
Il semble que j'ai besoin d'utiliser un MODULE_NAME_views_tables() fonction qui vous permet de Vues quelle est la relation entre la table je veux rejoindre et le nœud de la table.
J'ai ajouté les fonctions suivantes pour NOM_DU_MODULE.les vues.inc:
function MODULE_NAME_views_tables() {
$tables['node_weights'] = array(
"name" => "node_weights",
"join" => array(
"left" => array(
"table" => "node",
"field" => "nid"
),
"right" => array(
"field" => "nid"
),
),
);
return $table;
}
Cela ne semble pas fonctionner, car lorsque j'utilise Krumo à regarder la requête de tableau, je vois mon "node_weights" tableau dans le "table_queue" élément.
Dans le views_query_alter fonction de (), j'aimerais qu'il fonctionne quelque chose comme ceci:
function MODULE_NAME_views_query_alter(&$view, &$query) {
$uid = $_COOKIE['uid'];
$view->query->add_relationship('node_weights', new views_join('node_weights', 'nid', 'node', 'nid','LEFT'));
$view->query->add_where('node_weights', "node_weights.uid", $uid);
krumo($query);
}
Cette fonction barfs assez mal. Bien que ma table de jointure fait son apparition dans l'objet $view, le add_relationship méthode est de lancer une erreur pour un 3ème argument, mais je ne vois pas d'exemples en ligne qui ont 3 arguments donc je ne sais pas ce qu'il manque.
Aussi, je suis sûr que mon add_where méthode n'est pas correcte, mais je ne sais pas ce que les entrées. C'est juste un aveugle deviner.
La ligne de fond est que je veux rejoindre le nœud de la table à mon node_weights table, puis assurez-vous que mon poids sont utilisés dans la requête pour trier les résultats en descendant la mode, où l'id d'utilisateur = l'id de l'utilisateur dans ma table, et les tables sont jointes sur le nid de terrain.
Merci à l'avance.
La première étape est de définir une fonction pour décrire la relation de données dans la jointure de la nouvelle table à l'aide de HOOK_views_table().
La prochaine étape est de créer un HOOK_views_query_alter() fonction. À l'intérieur de cette fonction, il ya plusieurs éléments que vous avez à ajouter.
$join = new views_join; $rejoignez->construire('MODULE_NAME_node_weight','noeud','nid','nid',$aryextra,'LEFT OUTER');
La déclaration ci-dessus essentiellement présente la structure de la jointure. La viande est dans le $aryextra tableau qui a la structure suivante (j'ai eu un moment difficile de trouver une bonne documentation, si elle est ici): $aryextra[] = array('table' => 'TABLENAME','field' => "FIELDNAME','opérateur' => '=','valeur' => 'FIELDVALUE','numeric' => false);
OriginalL'auteur user830694 | 2011-07-27
Vous devez vous connecter pour publier un commentaire.
WHEREs sont assez faciles à ajouter une fois que vous avez le REJOINDRE. Vous pouvez à la fois dans une requête alter (Drupal 7).
OriginalL'auteur ummdorian
J'ai trouvé l'OP commentaires utiles dans la création d'une jointure dans la hook_views_query_alter fonction, j'ai donc voulu mettre les pièces, j'ai trouvé utile dans un plus digeste réponse.
J'ai été en utilisant des Vues 2x sur Drupal 6x, mais je suppose qu'il serait très similaire à l'utilisation sur D7 Vues 2.
L'OP mentionne décrivant la relation de la jointure dans hook_views_table. Ce n'était pas nécessaire pour moi, comme je n'étais pas en les reliant à une table personnalisée, mais à celle qui existait dans le noyau.
La jointure de la création dans le HOOK_views_query_alter() la fonction est très utile si:
Voir views_join::construire la documentation pour plus d'informations. En particulier, je n'ai pas besoin d'utiliser le "extra" paramètre que l'OP utilisé. C'est peut-être nécessaire avec une table personnalisée.
Enfin, ajouter le joindre à la requête, et tous les autres éléments sont nécessaires:
OriginalL'auteur TwainJ
Vous avez déjà la requête $dans les paramètres, de sorte que vous pouvez faire:
Pas besoin d'utiliser $view->query->...
OriginalL'auteur jebop