如何在视图中使用SelectQuery对象中的MySQL字段()函数? -- 7 领域 和 views 领域 和 database 领域 drupal 相关 的问题

How can I use the MySQL FIELD() function within a SelectQuery object in Views?


2
vote

问题

中文

我想使用mysql FIELD() 函数来改变查询,以便它在特定键的特定顺序上订购特定字段。

此"选择" 字段的键是:活动,under_contract,已售出

我想对视图进行排序,以便通过 node.created DESC (当然很简单),然后推动所有 sold 节点到结果的底部。

我尝试在hook_views_post_execute()中首先执行此操作:

  function mymodule_views_post_execute(&$view) {   if ($view->name == 'my_view') {     usort($view->result, function($a, $b) {       return ($a->field_field_status[0]['raw']['value'] == 'sold') ? 1 : -1;     });   } }   

但快速发现,由于我的视图仅显示每页25个结果,这仅将 sold 节点推到每个页面的底部。

下一个,我试图使用 hook_views_query_alter() 添加了我刚发现的令人敬畏的mysql FIELD() 函数,即我刚刚发现的 - 在MySQL中完美地实现我的目标 - 但可以要添加(至少在我发现)到一个选择Query对象,该视图用于运行查询:

  <a href="url">Description</a>0  

如何添加 <a href="url">Description</a>1 orderby函数到此查询?是否有另一种方法将特定的过滤器值推到结果队列的底部?

英文原文

I want to use the MySQL FIELD() function to alter a query so that it orders a particular field on a particular order of keys.

The keys for this 'select' field are: active, under_contract, sold

I want to sort the View so that all of my results are sorted first by node.created DESC (this is simple, of course) and then push all sold nodes to the very bottom of the result.

I tried doing this first in hook_views_post_execute():

function mymodule_views_post_execute(&$view) {   if ($view->name == 'my_view') {     usort($view->result, function($a, $b) {       return ($a->field_field_status[0]['raw']['value'] == 'sold') ? 1 : -1;     });   } } 

but quickly discovered that, since my view only shows 25 results per page, this only pushes sold nodes to the bottom of each page.

Next, I tried to use hook_views_query_alter() to add the awesome MySQL FIELD() function that I just discovered xe2x80x93 which works to achieve my goal perfectly in MySQL - but can't be added (at least as I'm discovering) to a SelectQuery object, which Views uses to run the query:

function mymodule_views_query_alter(&$view, &$query) {   if ($view->name == 'my_view') {     $query->orderby[0] = array(       'field' => " FIELD(field_data_field_status.field_status_value, 'sold') ",       'direction' => 'DESC',   );   } } 

How can I add a FIELD() orderby function to this query? Is there another method to push a particular filter value to the bottom of the result queue?

        
   
   

回答列表

3
 
vote
vote
最佳答案
 

我得到了这个工作!我找不到任何方法来获取 orderBy hook_views_query_alter() 中工作,所以我试图在原始 hook_query_alter() 中执行此操作。在我的特殊情况下,当我对视图已经加入的表(我无法解释原因)时,我无法得到任何结果,所以我添加了自己的加入。 Voila,它有效。

  function mymodule_query_alter($query) {   if ($query->hasTag('my_view_id')) {     // Remove the current sort order.      $order =& $query->getOrderBy();     $order = array();      // Join with the table that we need, giving it a custom alias.     $query->join('field_data_field_listing_status', 'custom_status', 'custom_status.entity_id = node.nid');      // Add our cool FIELD() function to push all 'sold' nodes to the very back of the list.     $query->orderBy("FIELD(custom_status.field_listing_status_value, 'sold')", 'ASC');      // Add any other ordering that we need...     $query->orderBy('node_created', 'DESC');   } }   
 

I got this working! I couldn't find any way to get the orderBy working in hook_views_query_alter(), so I tried to do this in the raw hook_query_alter(). In my particular situation, I couldn't get any result when I filtered against the table that Views had already joined with (I can't explain why) and so I added my own join. Voila, it works.

function mymodule_query_alter($query) {   if ($query->hasTag('my_view_id')) {     // Remove the current sort order.      $order =& $query->getOrderBy();     $order = array();      // Join with the table that we need, giving it a custom alias.     $query->join('field_data_field_listing_status', 'custom_status', 'custom_status.entity_id = node.nid');      // Add our cool FIELD() function to push all 'sold' nodes to the very back of the list.     $query->orderBy("FIELD(custom_status.field_listing_status_value, 'sold')", 'ASC');      // Add any other ordering that we need...     $query->orderBy('node_created', 'DESC');   } } 
 
 
0
 
vote

在以前的答案上建立(谢谢)。我找到了一种在观点内完成的方法。

"5,2,1,4" 只是ID的随机顺序,因此您可以通过您希望的任何字段和键来替换这一点。

  function HOOK_views_post_build ($view) {   if ($view->name == 'my_view' && $view->current_display == 'my_display') {       $view->build_info['query']->orderBy("FIELD(id,5,2,1,4)", 'ASC');     }   } }   
 

Building on the previous answer (thanks). I found a way to do it within the views API.

"5,2,1,4" is just a random order of ids, so you can replace this by whatever field and keys you wish.

function HOOK_views_post_build ($view) {   if ($view->name == 'my_view' && $view->current_display == 'my_display') {       $view->build_info['query']->orderBy("FIELD(id,5,2,1,4)", 'ASC');     }   } } 
 
 

相关问题

0  如何更新表单提交的自定义用户字段  ( How to update custom user field on form submit ) 
我想创建一个只有一个列出的自定义用户帐户字段之一的基本页面,可供编辑。 例如,我有一个自定义用户帐户字段:field_companyname 然后将用户转到 www.example.com/?q=user/1/edit , 我希望用户转到不同的页面(i.e www.example.com/node/5 )。 在此...

1  面板布局设计师  ( Panel layout designer ) 
我遇到了这个视频显示如何使用面板设置自定义主页。我安装了混沌工具套件,以及面板模块,但我没有看到视频中的布局设计器界面,因为它在视频中显示。 ...

5  滤波器术语引用  ( Term reference with filter ) 
我想知道是否可以使用可用分类术语的子集添加一个术语参考字段。让我解释。我有一个具有这样的结构的分类词汇,如下所示: - term 1 - term 1.1 - term 1.2 - term 1.3 - term 2 - term 2.1 - term 2.2 然后我将创建特定的内容类型...

4  如何在预告片中添加“添加新评论”链接中的rel =“nofollow”?  ( How to add rel nofollow in add new comment link in teaser ) 
是否有一个代码在预告片下"添加新的评论" 链接中添加rel ="nofollow" ? 这是D7生成的预告片中的代码: 添加新评论 所以我如何在该行中添加rel ="nofollow" ? ...

1  搜索API +视图  ( Search api views ) 
如何在视图中使用与索引节点的关系来检索来自其他实体的字段? 作为一个示例...如果我使用"索引节点:作者" 创建关系。然后尝试在搜索结果视图中显示作者的名称,名称为空。我已经尝试了从选项中的每个关系和字段组合,但名称始终为空。 ...

1  如何在单个页面上显示答案模块的所有链接?  ( How to display all links of the answers module on a single page ) 
我使用 ansess 模块,它提供了各种视图,如图所示图片下面。但它不提供我们可以作为链接提供这些视图的任何东西。 我的意思是我希望一行中的所有这四个视图作为页面的菜单选项卡, 所以,它应该是这样的: 主菜单选项卡: Q&A 此q&amp;单击选项卡,它应显示第一个选项卡的所有这些选项卡,默认为: 所有问题...

0  链接到视图中的节点  ( Link to node in views ) 
我有一个有2个显示器的视图: 列表:它是一个未格式化的列表,包含一个页面 表:显示表中的节点标题。 我需要的是在第二个显示器的每一行中的标题重定向到第一个显示中的相应节点,无论"每页项目" 和排序。 ...

2  Web服务器身份验证  ( Webserver authentication ) 
我正在寻找一个模块,用于为MS Windows网络实现单一登录。我找到了Web服务器身份验证( https://www.drupal.org/project/webserver_auth )。但是我在配置之前激活了模块,现在我无法访问admin,或者作为任何其他开发人员用户,以继续工作我的项目配置。 曾经有过这个问题...

3  通过URL通过分类学术语,以在Drupal 7中添加内容表格  ( Passing a taxonomy term via url to add content form in drupal 7 ) 
好的,我有一个drupal 7网站。这种情况是,让我们说我在我的网站上遇到恰好有一个分配给它的分类学期 - 让我们说这是ABC的术语。在侧边栏中的块中,我有一个链接将用户发送到Aducuit主题的添加内容表单。表单主题内容类型也具有CCK字段(相同的词汇表)。我正在尝试使用与他们来自的页面相同的术语abc填充该字段。...

4  在我的帐户菜单中“添加链接”  ( Add link in my account menu ) 
用户帐户页面(http://example.com/user)包含一些默认选项卡,如"查看" ,"编辑" 等。 我想在那里添加我的菜单链接。要返回的内容应依赖于用户ID。我该怎么做呢? ...

7  将内部连接更改为左侧连接3.3?  ( Changing an inner join to a left join in views 3 3 ) 
使用视图3.3,我在Drupal 7中有一个视图,其中我显示了两个内容类型。我基于仅附加到其中一个内容类型的字段的值的过滤条件。只要我拥有该字段标准,视图正在进行 INNER JOIN ,这导致它不会返回第一个内容类型的视图,这些类型没有附加该字段的第一个内容类型。 我从视图中复制查询,将 INNER 更改为 LE...

0  自动填充内容类型到另一个  ( Auto fill from on content type to another ) 
我有一个名为联系人的内容类型,一个人的基本信息。 (〜600节点) 我有另一个内容类型,如表单,具有所有与联系点的选择列表。当用户选择所需的 contact 时,按从选择列表中的名称,我需要其余的信息 contact 来自动 - 填写表格上的文本框。 任何想法? 注意:使用drupal 7 ...

39  托管文件:可能无法引用字段中使用的文件  ( Managed file the file used in the field may not be referenced ) 
我正在使用 managed_file 类型。每当我尝试编辑和保存具有托运_file元素的表单时出现错误:可能无法引用图片字段中使用的文件。 这是我正在使用的代码: function foo_form ($form, &$form_state, $foo) { ... $form['file...

3  如何设置Drupal性能监控以绕过清漆?  ( How to setup drupal performance monitoring to bypass varnish ) 
本月我的Drupal Hosting Company有很多正常运行时间问题。 大多数时候我的pingdom监视器甚至没有提醒问题,因为清漆仍然能够为缓存的主页提供服务。 如何绕过清漆以检查Drupal实例的真实健康吗?它们有一个用户名/密码选项,但我确定的是http用户名/密码,而不是基于表单的登录名。 如果我指定假...

4  如何在Drupal 7中以编程方式创建节点?  ( How to create a node programmatically in drupal 7 ) 
我知道您可以通过创建节点对象,然后触发node_save()以编程方式创建节点,但我实际上没有想要在数据库中存储节点。 是否有一种方法可以在查找内容屏幕中显示的代码中创建特定内容类型的节点,并使用视图等工作,但没有物理存储在数据库中。 我问的原因是,我有一个查看特定内容类型的一系列节点,但我想在该列表中创建自定义节...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.