节点在创建时插入的顺序是什么?

时间:2009-09-19 20:24:18

标签: database drupal

在Drupal中,如果要在节点表中插入内容,'nid'可以为null,但'vid'不能。对于node_revision表,反之亦然。

创建节点时插入的节点是什么顺序?

我无法插入节点表,因为我没有修订版ID;我无法插入node_revision表,因为我没有节点ID。

此外,是否有某种功能可以轻松为您插入?

2 个答案:

答案 0 :(得分:3)

node_save function is available的代码;你试着看看它是如何工作的吗?

以下是与节点创建相关的部分:

if ($node->is_new) {
  _node_save_revision($node, $user->uid);
  drupal_write_record('node', $node);
  db_query('UPDATE {node_revisions} SET nid = %d WHERE vid = %d', $node->nid, $node->vid);
  $op = 'insert';
}

显然,它首先保存节点的修订版,然后才会保存节点本身。

之后,更新node_revisions记录,以输入nid的值。


如果你想保存一个节点,你就不应该编写能够为你做到这一点的代码:你只需要调用node_save,它就会保存节点,调用所需的钩子以及所有这些。< / p>

答案 1 :(得分:0)

在Drupal 7中,与Drupal 6相比,顺序被反转:首先保存节点,然后保存节点修订版。

// Save the node and node revision.
if ($node->is_new) {
  // For new nodes, save new records for both the node itself and the node
  // revision.
  drupal_write_record('node', $node);
  _node_save_revision($node, $user->uid);
  $op = 'insert';
}

更新节点时,首先保存节点,然后保存节点修订版。

  // For existing nodes, update the node record which matches the value of
  // $node->nid.
  drupal_write_record('node', $node, 'nid');
  // Then, if a new node revision was requested, save a new record for
  // that; otherwise, update the node revision record which matches the
  // value of $node->vid.
  if (!empty($node->revision)) {
    _node_save_revision($node, $user->uid);
  }
  else {
    _node_save_revision($node, $user->uid, 'vid');
    $update_node = FALSE;
  }
  $op = 'update';

保存节点修订后,节点行将更新。

if ($update_node) {
  db_update('node')
    ->fields(array('vid' => $node->vid))
    ->condition('nid', $node->nid)
    ->execute();
}

在Drupal 7中,节点表的vid字段可以是NULL,而node_revision的nid和vid字段都不是NULL,尽管nid的值是0默认值。