从nid获取节点标题的最快方法是什么? -- 7 领域 和 nodes 领域 和 database 领域 和 performance 领域 drupal 相关 的问题

What is the fastest way to get node title from nid?


7
vote

问题

中文

说我有一个nid(或很多人)。加载节点要访问的标题是否会更快,或者执行获取节点标题所需的非常简单的DB_Query?

英文原文

Say I have an nid (or a lot of them). Would it be faster to load the node to access get the title, or do the very simple db_query required to get the node title?

           
 
 

回答列表

7
 
vote
vote
最佳答案
 

你说最快。

如果您可以妥协两件事,这应该是最快的东西。现在,请注意,您必须妥协:

  • 如果您只尝试获取节点 title ,以及确认没有其他 hook_node_load 实现(基本上会改变的模块处理程序它们被加载时的节点加载),可以使用 node_load() node_load_multiple() 功能,并转到此解决方案。

  • 在从数据库加载节点时,建议您使用查询标记来确保用户可以访问这些节点。如果您不使用任何节点访问模块,可以为此解决方案进行下降。

与上面的两点都记住,您可以使用这样的内容:
  function MYMODULE_node_get_title_fast(array $nids) {   $titles = &drupal_static(__FUNCTION__, array());   $return = array();   $unavailable = array();   foreach ($nids as $nid) {     // Lookup static cache of self.     if (array_key_exists($nid, $titles)) {       $return[$nid] = $titles[$nid];     }     else { // Set NULL, so unavailable nodes will have NULL as their return value.       $unavailable[$nid] = NULL;     }   }    if ($unavailable) {     $results = db_query("SELECT nid, title FROM {node} WHERE nid IN (:nids)", array(':nids' => array_keys($unavailable)))->fetchAllKeyed(0, 1);     if ($results) {       $return = $results + $unavailable;       $titles = $return + $titles;     }   }    return $return; }   

您可以传递一系列节点ID,上面的功能将返回它们的标题,没有 node_load 99887666 ,或 entity_load >开销。它还跳过节点访问检查,因此请勿在您想要任何类访问限制的站点中使用此功能。

使用示例:

   $titles = MYMODULE_node_get_title_fast(array(256, 258, 54898));   

您将返回一个数组,所有给定的数组值作为键,标题为它们的值。 NULL 如果节点不可用。

 

You said fastest.

If you can compromise two things, this should be the fastest one. Now, note that you have to compromise:

  • If you are only trying to get the node title, and if you are sure that there are no other hook_node_load implementations (basically module handlers that would alter the node load at the time they are loaded), you can skip using the node_load() or node_load_multiple() functions and go for this solution.

  • When loading a node from the database, it's advised that you use a query tag to make sure that the user has access to those nodes. If you don't use any node access modules, you can go down for this solution.

With both above points in mind you can uses something like this:

function MYMODULE_node_get_title_fast(array $nids) {   $titles = &drupal_static(__FUNCTION__, array());   $return = array();   $unavailable = array();   foreach ($nids as $nid) {     // Lookup static cache of self.     if (array_key_exists($nid, $titles)) {       $return[$nid] = $titles[$nid];     }     else { // Set NULL, so unavailable nodes will have NULL as their return value.       $unavailable[$nid] = NULL;     }   }    if ($unavailable) {     $results = db_query("SELECT nid, title FROM {node} WHERE nid IN (:nids)", array(':nids' => array_keys($unavailable)))->fetchAllKeyed(0, 1);     if ($results) {       $return = $results + $unavailable;       $titles = $return + $titles;     }   }    return $return; } 

You can pass an array of node IDs, and the above function will return their titles without the overhead of node_load, field_attach, or entity_load overheads. It also skips node access checks, so do not use this in sites that you want any sort of access restrictions.

Usage example:

 $titles = MYMODULE_node_get_title_fast(array(256, 258, 54898)); 

You would return an array, with all given array values as keys, and the title as their value. NULL if the node is unavailable.

 
 
 
 
5
 
vote

使用 node_load_multiple get带有您的nids的节点。

从文档页面中:

在需要从数据库中加载多个节点时,应使用此功能。如果在同一页面请求期间再次加载,则要将节点加载到内存中,并且不需要数据库访问。

 

Use node_load_multiple to get nodes with your set of nids.

From the documentation page:

This function should be used whenever you need to load more than one node from the database. Nodes are loaded into memory and will not require database access if loaded again during the same page request.

 
 
 
 
2
 
vote

为标题加载整个节点数据是overkill,如果应用Entity_load()或node_load()它涉及一堆连接,以呈现来自字段表的数据,这显然不是一个好的解决方案。我宁愿建议申请 hook_node_load0

 

Loading whole node data for just a title is overkill, if you apply entity_load() or node_load() it involved a bunch of joins to render the data from fields tables which obviously is not a good solution. I would rather suggest to apply db_query("SELECT title from {node} where nid = :nid and status and status = :status" , array(':nid' => <Your nid>, ':status' => 1 ( //for published nodes)))

 
 
     
     
2
 
vote

更好的方法是:

  hook_node_load1  

,我认为如果有办法将其直接查询到DB。然后你必须转到那样。在大多数情况下,这些方式都是完美的,简单和优化的。

 

the better way to do this is:

      <?php          $node_title = node_load($nid)->title;     ?> 

and i think that if there is a way to do it with out direct query to DB. then you must go to that way.as in most cases these ways are perfect,easy and optimized.

 
 
0
 
vote

此外,如果您想通过查询获取它,请使用db_select与 fetchfield

$结果= db_select('node','n')

- &gt;字段('标题')

- &gt;条件('nid',$ nid,'=')

- &gt;条件('status',0,'&gt;')

- &gt; execute()

- &gt; fetchfield();

 

Also if you want get it by query use db_select With fetchField

$result = db_select('node', 'n')

->fields('title')

->condition('nid', $nid,'=')

->condition('status', 0,'>')

->execute()

->fetchField();

 
 
0
 
vote

使用 function.very简单而干净;)

  hook_node_load2  

了解这个有用的功能。

node_load($ nid = null,$ vid = null,$ reset = false)

从数据库加载节点对象。参数

$ nid:节点ID。

$ vid:修订版本。

$重置:是否重置node_load_multiple缓存。

也是如果你想要 fetchfield 通过查询使用 db_select

  hook_node_load3  

也可以通过 db_query `

  hook_node_load4  

但是您可以通过自己尝试使用 hook_node_load5 hook_node_load6 非常小的。

如果只是一个简单的查询字符串,请使用此函数选择查询。如果来电者或其他模块需要更改查询,请使用 db_select()而不是。

 

The Easiest way to get it using node_load function.very simple and clean ;)

$node=node_load($nid); // So $node->title contatile title 

Learn this useful function.

node_load($nid = NULL, $vid = NULL, $reset = FALSE)

Loads a node object from the database. Parameters

$nid: The node ID.

$vid: The revision ID.

$reset: Whether to reset the node_load_multiple cache.

Also if you want get fetchField by query use db_select

$result = db_select('node', 'n') ->fields('title') ->condition('nid', $nid,'=') ->condition('status', 0,'>') ->execute() ->fetchAssoc(); 

Also you can get it by db_query`

$result = db_query('SELECT n.nid, n.title, n.created FROM {node} n WHERE n.nid = :nid', array(':uid' => $nid)); 

But you can try it by yourself speed test of getting one node with db_select db_query is very tiny.

Use this function for SELECT queries if it is just a simple query string. If the caller or other modules need to change the query, use db_select() instead.

 
 
       
       

相关问题

0  无法添加自定义字段以查看  ( Unable to add custom field to view ) 
我创建了一个名为'newsletters'的新内容类型,并创建了图像,文本和链接字段。 然后我创建了一个视图块,当我尝试插入我的自定义字段时,它们不会在字段列表中显示。我检查了我的模块和文件夹的权限,以便不应该是问题,日志中没有错误。 有点令人困惑。 Drupal 7.41 PHP 5.4.45. 查看7.x-3....

4  如何在单选按钮选择上提交呼叫处理程序?  ( How do i submit call handler on radio button selection ) 
我使用的在drupal 7中的高级民意调查 s模块。我正在尝试改变行为因此,在选择单选按钮时,会提交投票(无需点击 VOTE )。 模块正在使用ajax回调: $form['submit'] = array( '#type' => 'submit', '#ajax' => array( 'callback' ...

1  为什么在上传后垂直图像翻转水平?  ( Why do vertical images flip horizontal after upload ) 
我偶尔碰到这个问题,我不确定它是什么。例如,我有一个我从非耳机网站或直接从相机到达的图像。如果我通过我的MAC上的预览或从其垂直显示的网站上的浏览器查看图像。一旦上传到我的Drupal网站,它水平翻转。 要绕过这个,我只需在Mac上打开图像并只需重新保存。 我一直认为我的电脑以某种方式旋转图像只是为了显示(基于一些逻...

1  如何在网站的主页上包含Addzhis共享按钮?  ( How to include the addthis sharing buttons on the home page of a site ) 
我正在使用 addthis 模块将节点的共享功能公开给用户。 是否有一种方法可以在 主页上包含这些按钮 的drupal 7站点? 对于节点,它很容易将此添加为每个内容类型的字段,并且它为每个基于内容类型的节点显示。但我不确定如何为主页添加此页面。 ...

0  Drupal Search API自定义排序顺序  ( Drupal search api custom sort order ) 
我正在使用搜索api solr 并使用视图用于搜索结果。在我的内容类型中,将使用实体转换以及表示节点语言的字段存在多语言字段。我在网站上有三种语言。 我想按语言对结果进行排序。 ,如果网站语言设置为英语, 搜索结果应该首先列出所有英语语言节点,然后列出第二语言,然后是第三语言。建议我解决这个问题。 ...

0  如何以视图中编程方式添加链接到图像字段  ( How to programmatically add a link to an image field in a view ) 
我有一个映像字段和其他字段的视图,我需要链接渲染的图像,而不是配置选择的内容,而是在另一个计算的过滤的视图上。 我认为我应该使用 my_theme_preprocess_views_view_field_myviewname 来捕捉这个字段,使用它的名称作为选择器,然后将其包装在计算的链接中,但没有找到如何做到这一点...

2  $ pager_total_items在自定义搜索模块中提供错误的结果计数  ( Pager total items giving wrong results count in custom search module ) 
我不是太确定会发生什么,但在我的自定义搜索模块中, $GLOBALS['pager_total_items'] inall在第一页上是错误的。 例如,我搜索一个术语,它将显示:显示77个结果的1 - 10 ,寻呼机显示9页(当它应该仅显示8)。 然后,如果我点击寻呼机转到第2页(或任何其他页面),显示更改为:显...

3  为什么要从一组节点加载30秒加上的字段值?  ( Why is loading a field value from a group of nodes taking 30 seconds plus ) 
我有一个带有大约300,000个节点的D7网站。我传递这个函数是300-500个nids的数组。有时函数在一秒钟内运行。有时需要40秒或更长时间!我无法弄清楚导致慢速运行的原因。如何获得Query和Fast的查询? function _load_field_values_for_nids($field_name,...

0  每用户获得修订次数?  ( Get number of revisions per user ) 
我正在尝试展示用户编辑一个节点的次数,如下所示,因此我已经启用了对我的内容类型的修订。 user1(300) user2(288) user3(200) 问题是,当有人创建一个新节点时,它会在node_revision表中保存为修订,但我不想将其计算为编辑。 如何实现这一目标? 这是我正在使用的代码,到目前...

1  添加图像上传到主题配置  ( Add image upload to theme configuration ) 
我正在尝试将图像上传到我所做的主题中的主题设置。显示图像上传字段确实出现,但实际上没有上传,并且图像永远不会得到保存。 在主题 - settings.php中我有函数 function mytheme_form_system_theme_settings_alter(&$form, $form_state, $...

0  转换为指定的语言[已关闭]  ( Translate to specified language ) 
关闭。这个问题需要更多聚焦。它目前不接受答案。 想要改进这个问题?更新问题,因此它仅拍摄了一个问题,只有编辑此帖。 关闭 1年前。 ...

2  如何从节点中删除一些注释?  ( How to remove some comments from a node ) 
我在数据库中创建了一个新表,以将评论与他们提交的节点版本相关联。现在,当节点渲染时,我只想显示与特定节点VID关联的注释。我考虑在hook_node_view中查询db以删除不适用的注释,但理想情况下,只有与vid关联的注释首先将添加到节点。有没有更好的方法来实现这个?我可以在评论添加到它之前是否在节点上? ...

4  如何基于身体中的字符数显示视图块?  ( How to display a view block based on number of characters in body ) 
我目前有一个视图,它会创建"关于作者" 框,从用户的配置文件中提取信息,并根据节点(内容)的作者显示相应的作者框。我只想在节点中具有最小字符量的节点上显示它。 (它目前显示所有节点,块已启用。) 所需的结果是长块内容有一个"关于作者" 框,而短件的内容没有。 我所拥有的问题是,当我选择视图的过滤条件时,未列出节点的主...

1  某些阻止代码正确处理匿名用户  ( Certain block code processes correctly for anonymous user ) 
我在Drupal 7.41网站上安装了Bluemasters主题。在此主题中,我创建了几个新区域并将新块添加到这些区域,所有这些区域都在任何访问者可用的主页上。 我发现当我将其视为经过身份验证的用户时,主页与匿名用户一起看。作为匿名用户,我有4个独立的文本块,彼此顶部,但是当我登录此文本都是正确的地方。 我发现如果我...

0  克隆网站指向原始网站的数据库 - 这可能会出现问题吗?  ( Cloned site pointing to original sites database can this cause problems ) 
可以指向原始网站的数据库的克隆站点导致问题? 我正在使用坐在单独的服务器上的MySQL数据库运行Drupal 7站点。 我将站点的代码库存储库的克隆挂在一个单独的开发服务器上,然后将数据库的最近备份导入了一个新的数据库。该站点从不同的域中正常运行。 但是,我忘了更新 local.settings.php 文件...

0  仅为其他页面启用高速缓存的前页提升?  ( Boost only for front page with cache enabled for other pages ) 
我知道 boost 模块只在禁用耳机缓存时才工作。 但是有没有办法打开 boost 模块仅限前页,启用缓存对于其他页面。 ...

-1  找到所有节点中重复了多少次关键字  ( Find how many times keyword is repeated in all nodes ) 
我有商业列表的节点,具有业务的标题,正文和其他联系人字段。 我想对所有内容"10000节点" 进行研究,并在每个节点的标题和身体字段中找到最重复的单词,因此我可以使用找到的关键字标记内容。 任何想法? ...

1  如何检查实体已创建?  ( How to check entity is already created ) 
我有创建名为"胜利" 的代码以实体类型为单位,我的问题是如何防止用户再次以相同的名称创建实体。 function commerce_services_store_create($data, $flatten_fields) { $storeName = $data['store_name']; $stat...

0  WebServices创建(注册)新用户  ( Webservices to create register a new user ) 
我计划编写连接到Drupal 7的客户端应用程序。我喜欢通过应用程序创建新用户,遇到一些文献,但我不确定该方法是否安全,也是它是否认为所有可能的使用 - 案例。 我遇到的第一个链接是这样的: https://www.drupal.org/node/1514312 我能够配置端点并成功发布+创建用户。但是,上述方...

4  如何为特定的Drupal页面添加jQuery较低版本?  ( How to add jquery lower version for a particular drupal page ) 
我已安装jQuery更新模块并将jQuery 1.10设置为默认jQuery版本,但我以前的功能停止工作之一。 我只想为特定页面使用jQuery 1.8。我如何实现这一目标? ...




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


Licensed under cc by-sa 3.0 with attribution required.