Я пытаюсь изменить запрос для Views в Drupal (Views версии 3, Drupal version 7).
Что я хочу сделать, это изменить запрос перед его выполнением таким образом, чтобы он LEFT присоединился к таблице ву меня есть веса, назначенные узлам.
Если бы я должен был написать запрос, который я хочу в SQL, это выглядело бы так:
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
Этот запрос работает как чемпион, когда язапустите его в анализаторе запросов.Итак, теперь мне нужно, чтобы он работал в моем модуле.
Я видел несколько подходов, подробно описанных в разных блогах, для разных способов изменения запросов View, но они, похоже, обращаются к разным версиям Views.Поэтому очень сложно попытаться определить, может ли что-то, на что я смотрю, работать, возможно, для моего приложения.
Кажется, мне нужно использовать функцию MODULE_NAME_views_tables (), чтобы сообщить Views, какова связь междутаблица, к которой я хочу присоединиться, и таблица узлов.
Я добавил следующие функции в MODULE_NAME.views.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;
}
Это работает, потому что когда я используюКрумо, чтобы посмотреть массив запросов, я вижу свою таблицу «node_weights» в элементе «table_queue».
В функции views_query_alter () я бы хотел, чтобы она работала примерно так:
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);
}
Эта функция довольно плохо работает.Хотя моя таблица соединений отображается в объекте $ view, метод add_relationship выдает ошибку для 3-го аргумента, но я не вижу примеров в Интернете, в которых есть 3 аргумента, поэтому я не знаю, чего в нем не хватает.
Кроме того, я почти уверен, что мой метод add_where неправильный, но я не знаю, какими должны быть входные данные.Это всего лишь слепое предположение.
Суть в том, что я хочу присоединить таблицу узлов к моей таблице node_weights, а затем убедиться, что мои веса используются в запросе для сортировки результатов по убыванию, гдеидентификатор пользователя = идентификатор пользователя в моей таблице, и таблицы объединяются в поле nid.
Заранее спасибо.