【问题标题】:How to create a query in Drupal 8如何在 Drupal 8 中创建查询
【发布时间】:2016-02-29 21:49:16
【问题描述】:

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

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

即使 db_selectdb_query 已被弃用,我是否仍使用它们?或者创建一个新的控制器来扩展“Select class”并进行查询?

【问题讨论】:

  • 我建议您将问题改写为“如何在 D8 中进行查询”之类的内容,因为它基于意见而吸引投票结束。
  • 你想达到什么目的?

标签: php mysql drupal drupal-8


【解决方案1】:

取决于你想要达到的目标。


使用存储对象

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

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

使用实体查询和 loadMultiple

如果您需要更复杂的查询,包括排序、范围、分页器和 OR/AND 条件组,您应该使用实体查询

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

【讨论】:

    【解决方案2】:

    如文档中所述,您可以通过注入 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(" ... ");   
      }
    
    }
    

    【讨论】:

    • 感谢您的评论!很有帮助!
    【解决方案3】:

    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();
    

    【讨论】:

    • 问题:'t' 的两个实例都是您想要获取的行的名称吗?
    • fields() 需要超过 1 个参数,如果您使用 ->fields('t') 即,您只提供 1 个参数,这是您定义为别名的参数,它转换为 ' *' 如果您正在编写 SQL 查询,您将使用它来获取所有字段。从您使用的表中获取一组字段,例如 'a'、'b' ->fields('t', array('a', 'b'))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-06
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2018-04-29
    • 1970-01-01
    相关资源
    最近更新 更多