我想修改在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字段中。
在此先感謝。
我不能由於某種原因發佈自己的問題的答案,但我找到了解決方案,所以我會嘗試在評論中解釋它。 – user830694
第一步是使用HOOK_views_table()設置一個函數來描述新表的連接中的數據關係。 – user830694
下一步是創建一個HOOK_views_query_alter()函數。在那個函數裏面有幾個你必須添加的項目。 – user830694