Drupal 10 数据库的增删改查语句都怎么写?

Drupal 有自己的数据库操作函数,并不是直接写 SQL 语句,所以像 SELECT, INSERT, UPDATE, DELETE 这些常见操作,在 Drupal 里要怎么写?希望前辈们能给一些例子,非常感谢!

2
0

1 个回答

Drupal 也可以直接使用 SQL 语句进行数据库查询。直接使用 SQL 语句的方式被称为静态查询,使用数据库 API 动态构造 SQL 语句地方式被称为动态查询

因为较新版本的 Drupal 要求所有 INSERT, UPDATE DELETE 请求都必须是动态的,所以这里的动态查询是指动态的 SELECT 请求。

静态查询易于使用,性能也更好一些,所以大部分 SELECT 请求依然可以使用静态查询方式。但如果 SQL 的部分语句会因业务逻辑而有所不同,或 SQL 语句之后需要按条件被修改、扩充,则使用动态查询会更方便一些。

静态查询

使用数据库连接对象的 query() 方法,大部分 SELECT 语句可以使用静态查询。

$database = \Drupal::database();
$query = $database->query("SELECT id, example FROM {mytable}");
$result = $query->fetchAll();

在 SQL 语句中使用参数占位符,以便 Drupal 可以区分语句和用户输入数据并进行处理,避免 SQL 注入攻击:

$result = \Drupal::database()->query("SELECT example FROM {mytable} WHERE type = :type", [
  ':type' => 'mytype',
]);

动态查询

动态查询使用 select() 代替 query().

$result = \Drupal::database->select('mytable', 'm')
  ->fields('m')
  ->condition('type', 'mytype')
  ->fetchAll();

有关动态查询的更多用法(如分组、计数、排序等等),可参考官方文档:https://www.drupal.org/docs/8/api/database-api/dynamic-queries

Insert

$result = \Drupal::database()->insert('mytable')
	->fields([
		'title' => 'example',
		'uid' => 1,
		'created' => \Drupal::time()->getRequestTime(),
	])
	->execute();

等价于:

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

Update

$num_updated = \Drupal::database()->update('mytable')
  ->fields([
    'field1' => 5,
    'field2' => 1,
  ])
  ->condition('created', \Drupal::time()->getRequestTime() - 3600, '>=')
  ->execute();

等价于:

UPDATE {mytable} SET field1=5, field2=1 WHERE created >= 1221717405;

Delete

$num_deleted = \Drupal::database()->delete('mytable')
  ->condition('myfield', 5)
  ->execute();

等价于

DELETE FROM {mytable} WHERE myfield=5;

有关 Upsert、事务、错误处理等更多数据库 API 的使用信息可以参考官方文档:https://www.drupal.org/docs/drupal-apis/database-api

3
0
登录注册后添加答案