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

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

3、多插入语句

Drupal开发中,插入查询对象也可以采用多个值集。也就是说,可以多次调用Values()来将多个INSERT语句并入。究竟如何发生将取决于所讨论的数据库的能力。在大多数数据库中,多个INSERT语句将在事务内部一起执行,以获得更大的数据完整性和速度。在MySQL中,它将使用MySQL的多值插入语法。

$values = [

[

'title' => 'Example',

'uid' => 1,

'created' => REQUEST_TIME,

],

[

'title' => 'Example 2',

'uid' => 1,

'created' => REQUEST_TIME,

],

[

'title' => 'Example 3',

'uid' => 2,

'created' => REQUEST_TIME,

],];

$query = $connection->insert('mytable')->fields(['title', 'uid', 'created']);

foreach ($values as $record) {

$query->values($record);

}

$query->execute();

上面的示例将使用三个插入语句作为一个单元来执行,使用在使用中的特定数据库驱动程序的最有效方法。注意,这里我们已经保存的查询对象的变量,我们可以循环调用$values 和values()方法反复。

在退化情况下,上述示例相当于以下三个查询:

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

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

INSERT INTO {mytable} (title, uid, created) VALUES ('Example3', 2, 1221717405);

注意在多插入查询返回的值是未定义的,execute()不应该被信任,因为它可以根据不同的数据库驱动程序。

4、基于选择查询的结果插入

如果要用其他表的结果填充表,则需要从源表中选择,在PHP中迭代数据并将其插入到新表中,或者可以从查询中插入一个插入项,在该查询中,从SELECT查询返回的每个记录都被馈入。插入查询。

在这个例子中,我们要构建一个表MyTABLE,它有一个NID和一个用户名,它是page类型的系统中的所有节点。

<?php
// Build the SELECT query.
$query = $connection->select('node', 'n');
// Join to the users table.
$query->join('users', 'u', 'n.uid = u.uid');
// Add the fields we want.
$query->addField('n','nid');
$query->addField('u','name');
// Add a condition to only get page nodes.
$query->condition('type', 'page');

// Perform the insert.
$connection->insert('mytable')
->from($query)
->execute();
?>

6、默认值

在正常情况下,如果不为给定字段指定值,并且默认值由表的架构定义,则数据库将悄悄地为您插入默认值。然而,在某些情况下,需要显式指示数据库使用默认值。这包括如果您想使用整个记录的所有默认值。为了明确地告诉数据库使用给定字段的默认值,有一个useDefaults()方法。

$query->useDefaults(['field1', 'field2']);

这一行指示查询使用数据库定义的默认字段和专业领域。请注意,这是在usedefaults()和fields()或values()指定相同的一个错误,并将抛出一个异常。