寻找数据库插入示例


12

根据db_insert手册页,此功能已被弃用,最好使用Drupal 8数据库连接来执行插入。

不推荐使用

从Drupal 8.0.x开始,将在Drupal 9.0.0中删除。而是从容器中将数据库连接注入到服务中,然后在其上调用insert()。例如,$ injected_database-> insert($ table,$ options);

现在如何获得数据库连接和调用insert()方法?


您的意思是在课堂之外提供注射服务吗?喜欢\Drupal::database()->insert(...);吗?
克莱夫(Clive)

不,我的意思是在课堂上提供注射服务class PetmdController extends ControllerBase
Mohammad Ali Akbari 2015年

Answers:


19

要注入数据库服务,请在控制器类中添加/更改以下方法:

use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Database\Connection;
use Symfony\Component\DependencyInjection\ContainerInterface;

class PetmdController extends ControllerBase {

  protected $database;

  public function __construct(Connection $database) {
    $this->database = $database;
  }

  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('database')
    );
  }

  public function foo() {
    $this->database->insert(...)->fields(...)->execute();
  }
}

这对于ControllerBase来说非常有用,但是如果我的类正在扩展已经将不同变量传递到构造中的ContentEntityBase,我将如何注入数据库服务?
菲利克斯·夏娃

3

要添加到Berdir的答案,这里是如何在控制器中注入数据库服务

$db = \Drupal::database();
      $query = $db->select('location','loc');
      $query->fields('loc', array('id', 'name', 'bond_goal','deposit_goal','date_created','date_updated'));
      $query->addField('loc','name','location_title');
      $table_sort = $query->extend('Drupal\Core\Database\Query\TableSortExtender')->orderByHeader($header);
      $pager = $table_sort->extend('Drupal\Core\Database\Query\PagerSelectExtender')->limit(10);

您可以学习core/lib/Drupal/Core/Database/Query课程以获取更多信息


2

首先,正如您的报价所述,Drupal 9不推荐使用。这意味着它将保留数年,并且永远不会从Drupal 8中删除。

但是,是的,避免使用过时的功能是个好主意。像任何其他不推荐使用的功能一样,您始终可以简单地查看其实现,以了解新的实现方式。尽管不是调出\ Drupal,而是希望在可能的情况下(当您位于服务,控制器,表单,插件等时)注入数据库或所需的任何其他服务。


1

选项1:

$db = \Drupal::database();
$query = $db->select('k_product', 'p');
$query->fields('p', ['idpr', 'name', 'type']);
$data = $query->execute()->fetchAllAssoc('idpr', 'name', 'type');

选项2

$db = \Drupal::database();
$data = $db->query('SELECT idpr, name, code, detail FROM k_product')->fetchAllAssoc('idpr', 'name');
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.