2011-07-27 62 views
4

我想修改在Drupal視圖查詢(查看版本3,Drupal的第7版)。添加表時,如果和排序來查看查詢在views_query_alter()

我想要做的就是更改查詢運行,使得LEFT JOIN的在我所分配到的節點權重表之前。

如果我是寫我要在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 

此查詢的工作原理是,當我在查詢分析器運行一個冠軍。所以,現在我需要讓它在我的模塊中工作。

我已經看到了各種博客詳細介紹了不同的方式來修改視圖的查詢多種方法,但他們似乎是解決不同版本的瀏覽的。因此,試圖確定我所看到的任何內容甚至可能適用於我的應用程序,這是非常令人困惑的。

看來,我需要使用MODULE_NAME_views_tables()函數來告訴意見的關係是什麼,我想加入表和節點表之間。

我已經添加了以下功能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; 
    } 

這似乎是工作,因爲當我使用Krumo看查詢陣列,我看到我的「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); 
    } 

此功能barfs相當嚴重。儘管我的連接表出現在$ view對象中,但add_relationship方法爲第三個參數拋出錯誤,但我沒有看到任何有3個參數的在線示例,因此我不知道它缺少的是什麼。

而且,我敢肯定我add_where方法是不正確的,但我不知道是什麼的投入實際上應。這只是一個盲目的猜測。

底線是我想要加入到我的node_weights表中的節點表,然後確保我的權重用於查詢以降序方式對結果進行排序,其中用戶id =我的用戶id表,並且這些表被加入到nid字段中。

在此先感謝。

+0

我不能由於某種原因發佈自己的問題的答案,但我找到了解決方案,所以我會嘗試在評論中解釋它。 – user830694

+0

第一步是使用HOOK_views_table()設置一個函數來描述新表的連接中的數據關係。 – user830694

+0

下一步是創建一個HOOK_views_query_alter()函數。在那個函數裏面有幾個你必須添加的項目。 – user830694

回答

3

我發現OP的評論在創建中hook_views_query_alter功能的加入有幫助,所以我希望把我認爲有用的部分更易消化的答案。 我在Drupal 6x上使用Views 2x,但我認爲它與在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::construct documentation。特別是,我不需要使用OP使用的'extra'參數。對於自定義表格,這可能是必要的。

最後,添加一個連接到查詢,以及其它元件是由它需要:

// 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'); 
... 
4

何在是很容易添加一旦你已經得到了加入你既可以在查詢改變(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', 
     'opperator' => '=' 
    ); 
}} 
0

你已經在參數$查詢,所以你可以做:

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

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

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

無需使用視圖 - $>查詢 - > ...