drupal_write_records()不适用于hook_update_n()创建的那些字段

时间:2014-11-19 09:31:06

标签: drupal

目前我已经在drupal 7中使用安装模式创建了表。之后,使用hook_update_n()更改表以添加新列。

现在drupal_write_records()不起作用 那些由hook_update_n()。

创建的字段

此致 拉吉。

1 个答案:

答案 0 :(得分:2)

hook_schema hook_update_N

Drupal提供了一种非常强大且结构化的方式来升级您的网站并进行DDIC更改。两个重要的钩子是hook_schema()提供了一种结构化的,独立于数据库的方法来定义表模式。安装新模块时,会自动调用hook_schema()(是的,这是Drupal 7中的情况,而在Drupal 6中则必须明确用于创建表)并创建表。

现在你的表已经创建并且正在使用模块,你决定在表中进行更改,让我们说你决定添加一个新字段。现在,这种变化将如何到达所有系统并无缝升级,以便依赖于此字段的模块/代码不会中断。

Drupal提供另一个名为hook_update_N()的钩子,其中N是一个数值,表示模式的版本,例如mymodule_update_1()用于第一次更改,mymodule_update_2()用于第二次更改,依此类推。回到我们的例子,假设你需要添加一个新字段,你需要按如下方式实现钩子

/**
 * Implements hook_update_N().
 */ 
function mymodule_update_1() {
  db_add_field('mytable', 'myfield', array(
    'description' => 'My Status Field',
    'type' => 'int',
    'not null' => FALSE,
    'unsigned' => FALSE,
  ));
}

完成此操作后,必须使用drush updb或url /update.php运行更新。运行更新后,Drupal会识别出架构中存在更新,因为从未运行过数字1(来自上面的示例)。它运行该函数并将模式的版本跟踪为1.因此,下次进行另一次更改并需要更新表模式时,您可以使用任何高于先前最大数字的数字,Drupal将应用该更改。

现在hook_update_N()的变化是否足够?答案是否,您需要更新相应表的hook_schema()。有两个原因     1.在此之后运行任何查询时,Drupal将不会在表模式定义中找到新字段,因此不会写入此字段,例如当使用drupal_write_record()时。     2.当模块安装在以前从未拥有此模块的新站点中时,Drupal将仅运行hook_schema()并且不会运行任何其他更新,因为它需要表模式     是最新的,并将架构版本存储为最高的hook_update_N()编号。只有在运行更新后才会应用此更改。

<强>结论

必须在hook_schemea()中更新适当的表模式。 接下来使用hook_update_N()执行数据库更新,其中N&gt;过去最大更新号码