Drupal 将表联接、Where和Order By添加到视图中的视图查询\u Query\u alter()
我正在尝试修改Drupal中视图的查询(视图版本3,Drupal版本7) 我要做的是在运行之前更改查询,使其左键联接一个表,在该表中,我为节点分配了权重 如果我要用SQL编写我想要的查询,它将如下所示:Drupal 将表联接、Where和Order By添加到视图中的视图查询\u Query\u alter(),drupal,drupal-7,drupal-views,Drupal,Drupal 7,Drupal Views,我正在尝试修改Drupal中视图的查询(视图版本3,Drupal版本7) 我要做的是在运行之前更改查询,使其左键联接一个表,在该表中,我为节点分配了权重 如果我要用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
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
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);
}
当我在查询分析器中运行此查询时,它的工作方式就像champ一样。所以,现在我需要让它在我的模块中工作
我在不同的博客上看到了多种修改视图查询的方法,但它们似乎在处理不同版本的视图。因此,试图确定我正在查看的任何内容是否可能适用于我的应用程序是非常令人困惑的
似乎我需要使用MODULE_NAME_views_tables()函数来告诉视图我要连接的表和节点表之间的关系
我已将以下函数添加到模块_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查看查询数组时,我在“table_queue”元素中看到了我的“node_weights”表
在views\u query\u alter()函数中,我希望它能像这样工作:
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
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方法为第三个参数抛出了一个错误,但是我在网上没有看到任何有三个参数的示例,所以我不知道它缺少什么
另外,我很确定我的add_where方法是不正确的,但我不知道输入应该是什么。这只是瞎猜
底线是,我希望将节点表连接到我的node_weights表,然后确保在查询中使用我的权重以降序方式对结果进行排序,其中用户id=我表中的用户id,并且在nid字段上连接这些表
提前谢谢 我发现OP的注释有助于在hook\u views\u query\u alter函数中创建连接,所以我想把我发现有用的部分放在一个更容易理解的答案中。 我在Drupal6x上使用了Views2X,但我认为它与在D7Views2上的使用非常相似 OP提到了描述hook\u views\u表中连接的关系。这对我来说不是必需的,因为我并没有链接到一个自定义表,而是一个存在于core中的表 HOOK\u views\u query\u alter()函数中的连接创建非常有用,不过:
$join = new views_join;
$join->construct('table_name',
'node', // left table
'nid', // left field
'nid', // field
)
有关更多信息,请参阅。特别是,我不需要使用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');
...
一旦你加入了,你就可以很容易地添加到哪里。您可以在查询alter(Drupal7)中同时使用这两种方法
您已经在参数中设置了$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->…我无法对自己的问题给出答案,但我确实找到了解决方案,因此我将尝试在注释中解释。第一步是使用HOOK\u views\u table()设置一个函数来描述新表联接中的数据关系。下一步是创建一个HOOK\u views\u query\u alter()函数。在该函数中,您必须添加几个项。$join=newviews\u join$join->construct('MODULE_NAME_node_weight','node','nid','nid','aryetra','LEFT OUTER');上面的语句基本上列出了连接的结构。meat位于$arytextra数组中,该数组具有以下结构(我很难找到好的文档,所以这里是:$arytextra[]=array('table'=>'TABLENAME','field'=>'FIELDNAME','operator'=>'FIELDNAME','value'=>'FIELDVALUE','numeric'=>false);