Drupal 10 数据库的增删改查语句都怎么写?
Drupal 有自己的数据库操作函数,并不是直接写 SQL 语句,所以像 SELECT, INSERT, UPDATE, DELETE 这些常见操作,在 Drupal 里要怎么写?希望前辈们能给一些例子,非常感谢!
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