Добавить объединение таблиц, где и упорядочить по запросам в Views в views_query_alter () - PullRequest
4 голосов
/ 28 июля 2011

Я пытаюсь изменить запрос для 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.

Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 05 августа 2015

ГДЕ довольно легко добавить, когда вы подключились. Вы можете изменить оба запроса (Drupal 7).

function MODULE_NAME_views_query_alter(&$view, &$query){

// Only alter the view you mean to.
if($view->name == 'VIEW NAME' && $view->current_display == 'DISPLAY'){

    // Create the join.
    $join = new views_join();
    $join->table = 'table_name';
    $join->field = 'entity_id';
    $join->left_table = 'node';
    $join->left_field = 'nid';
    $join->type = 'left';
    // Add the join the the view query.
    $view->query->add_relationship('table_name', $join, 'node');

    // Add the where.
    $view->query->where[1]['conditions'][] = array(
        'field' => 'table_name.collumn_name',
        'value' => 'value',
        'operator' => '='
    );
}}
3 голосов
/ 08 октября 2013

Я нашел комментарии ОП полезными при создании объединения в функции hook_views_query_alter, поэтому я хотел поместить части, которые мне показались полезными, в более удобочитаемый ответ.Я использовал Views 2x на Drupal 6x, но я предполагаю, что это будет очень похоже на использование на D7 Views 2.

В описании OP описываются отношения объединения в hook_views_table.Это было не нужно для меня, так как я не связывался с пользовательской таблицей, а существовал в ядре.

Создание объединения в функции HOOK_views_query_alter () было очень полезным, хотя:


$join = new views_join;
$join->construct('table_name',
        'node',  // left table
        'nid',   // left field
        'nid',   // field
    )

См. views_join :: конструкторскую документацию для получения дополнительной информации.В частности, мне не нужно было использовать дополнительный параметр, который использовал OP.Возможно, это необходимо для пользовательской таблицы.

Наконец, добавьте объединение к запросу и все остальные элементы, которые ему нужны:

// Add join to query; 'node' is the left table name
$view->query->add_relationship('table_name',$join,'node');

// Add fields from table (or where clause, or whatever)
$view->query->add_field('table_name','field_name');
...
0 голосов
/ 15 октября 2015

У вас уже есть $ query в параметрах, так что вы можете просто сделать:

myhook_views_query_alter(&$view, &$query) {
 if ($view->name = ....) {

  $join = new views_join();
  $join->construct(
    ...
  );

  $query
    ->add_relationship(...)
    ->add_where(...)
    ->add_orderby(...)
    ...
  ;
}

Нет необходимости использовать $ view-> query -> ...

...