我有一个带有多个节点的现有内容类型。我刚刚添加了一个默认值为“ off”的新布尔字段。
但是,在我重新保存每个节点之前,未设置默认值,因此仅应显示新字段使用默认值的那些节点的视图当前为空。
如何更新在添加字段之前创建的现有节点,以将该字段设置为其默认值?
我有一个带有多个节点的现有内容类型。我刚刚添加了一个默认值为“ off”的新布尔字段。
但是,在我重新保存每个节点之前,未设置默认值,因此仅应显示新字段使用默认值的那些节点的视图当前为空。
如何更新在添加字段之前创建的现有节点,以将该字段设置为其默认值?
Answers:
遗憾的是,没有一种非常简单的方法(VBO /规则除外),但这是我在自定义模块安装文件中的更新函数中使用的代码,当我需要在添加新字段后预先填充特定节点类型的字段值时(在这种情况下,“页面”节点):
<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
$fields = array(
'entity_type' => 'node',
'bundle' => 'page',
'deleted' => 0,
'entity_id' => $values->nid,
'revision_id' => $values->vid,
'language' => LANGUAGE_NONE,
'delta' => 0,
'field_page_new_field_value' => 1,
);
db_insert('field_data_field_page_new_field')
->fields($fields)
->execute();
db_insert('field_revision_field_page_new_field')
->fields($fields)
->execute();
}
?>
此答案中提到的另一种手动方法使用EntityFieldQuery并加载/保存每个节点。Drupal-y较多,但性能较差...(需要完整的节点加载并为每个节点保存操作!)。
entity_get_controller('node')->resetCache($nids);
-否则后续操作node_load()
可能会从缓存中加载陈旧数据,并且node_save()
该对象中的任何一个都会将该陈旧数据写回到数据库中。
最好的选择是直接在MySQl中。这些表如下所示:
field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname
如果您看一下它们,这很简单-您是否需要我来让您开始查询的外观,还是可以从这里开始?
只需尝试下面的逻辑。它的速度要快得多,并且还绕过了所有钩子实现。更多细节。您可以编写一个简单的直接db_select查询来获取所有nid,并使用此示例代码对其进行循环。
$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);
使用sql,考虑未设置字段值的节点是
SELECT nid,vid
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)
field_data_field_pr_choix_du_document是与我的字段对应的表,并且包含一个条目par值,该条目的par值设置为与节点有关的实体id
我确实使用SQL插入...选择语法
https://dev.mysql.com/doc/refman/5.5/zh-CN/insert-select.html
INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)