如何在Drupal 8中创建查询


How to create a query in Drupal 8

我习惯于在drupal 7中使用db_select,但现在它在drupel 8 中已被弃用

所以,如果我需要创建一个查询来列出users_field_data表中的所有用户,我该怎么办?

我是否仍然使用db_selectdb_query,即使它们是不推荐使用的函数?或者创建一个新的控制器从"Select class"扩展并进行查询?

取决于您想要实现的目标。


使用存储对象

如果你想对用户进行简单的查询,那么你应该使用存储对象的loadByProperties

$users = 'Drupal::entityTypeManager()->getStorage('user')->loadByProperties([
  'name' => 'bar'
]);

使用实体查询&loadMultiple

如果您需要具有排序、范围、寻呼机和OR/and条件组的更复杂的查询,则应使用实体查询

$ids = 'Drupal::entityQuery('user')->condition('name', 'foo')->execute();
$users = User::loadMultiple($ids);

如文档中所述,您可以通过注入Drupal的数据库连接类来查询数据。例如:

use Drupal'Core'Database'Connection;
class DatabaseQueryExample {
  protected $connection;
  public function __construct(Connection $connection) {
    $this->connection = $connection;
  }
  public function queryExamples() {
    // db_query()
    $this->connection->query(" ... ");
    // db_select()
    $this->connection->select(" ... ");   
  }
}

db_selectdb_insertdb_update等…在Drupal 8.0.x中已弃用,并将在Drupal 9.0.0中删除。

相反,将数据库连接从容器注入到服务中,并在其上调用select()。例如,$injected_database->select($table, $alias, $options);

例如:

$db = 'Drupal::database();
$data = $db->select('table_name','t')->fields('t')->execute();
$db->insert();
$db->update();