DRUPAL8模块开发 - DRUPAL8数据库API - 插入数据(一)

翻译者:长风Drupal开发团队(成都长风云信息技术有限公司)

Drupal开发中,插入查询必须始终使用查询生成器对象。某些数据库需要对LoB(大型对象,如MySQL中的文本)和BLB(二进制大对象)字段进行特殊处理,因此需要一个抽象层来允许各个数据库驱动程序执行它们所需的任何特殊处理。

使用INSERT()方法启动插入查询如下:

$query = $connection->insert('mytable', $options);

创建插入查询对象将插入一个或多个记录的表表。注:括号不需要在表名作为查询生成器,自动处理。

INSERT查询对象使用FLUENT API。那就是,所有的方法(除了execute())返回查询对象本身允许方法调用被。在许多情况下,这意味着查询对象将不需要保存到一个变量在所有。

插入查询对象支持许多不同的使用模式,支持不同的需求。在一般情况下,工作流由指定的查询将插入字段,指定值的查询将这些字段插入,并执行查询。下面列出了最常用的推荐使用模式。

1、紧凑形式

在Drupal项目开发的实际应用中,对于大多数插入查询的首选形式是紧凑的形式:

$result = $connection->insert('mytable')

->fields([

'title' => 'Example',

'uid' => 1,

'created' => REQUEST_TIME,

])

->execute();

这导致等效于以下查询:

INSERT INTO {mytable} (title, uid, created) VALUES ('Example', 1, 1221717405);

上面的代码段将插入过程的关键部分链接在一起

$connection->insert('mytable')

这行命令给mytable表插入一个新的查询对象。

->fields([

'title' => 'Example',

'uid' => 1,

'created' => REQUEST_TIME,

])

Drupal开发中,fields()方法以参数的几种形式,但单一的关联数组是最常见的。该数组的键是表中的列,插入的值插入相应的值。这将导致在一个单一的插入查询指定表。

->execute();

Drupal 使用execute()方法告诉语句开始运行。除非调用此方法,否则语句不执行。

与drupal中插入查询对象的其他方法不同,它(execute())返回查询对象本身,execute()返回插入查询填充的自动增量(在hook_schema中是自增类型)字段的值(如果有的话)。这就是为什么在上面的例子中将它的返回值分配给$result。如果没有自动递增字段,从execute()返回值是未定义的,不应该被信任。

Drupal开发中,这是首选的格式插入查询。

2、退化形式

$result = $connection->insert('mytable')

->fields(['title', 'uid', 'created'])

->values([

'title' => 'Example',

'uid' => 1,

'created' => REQUEST_TIME,

])

->execute();

这是先前查询的一些更冗长的等价物,并且将具有完全相同的结果。

->fields(['title', 'uid', 'created'])

 当field()被索引数组而不是关联数组调用时,它只设置将在查询中使用的字段(数据库列),而不为它们设置任何值。这对于以后运行多插入查询很有用。

->values([

'title' => 'Example',

'uid' => 1,

'created' => REQUEST_TIME,

])

此方法调用指定字段名称的关联数组到插入这些字段的值。Values()方法也可以采用索引数组。如果使用索引数组,值的顺序必须匹配字段()方法中字段的顺序。如果使用关联数组,则可以按任意顺序排列。一般来说,关联数组优选可读性。

这种查询形式很少使用,因为紧凑型是首选。在大多数情况下,分隔字段()和值()的唯一原因是运行多插入查询时。