Ищем пример вставки базы данных

12

Согласно db_insertстранице руководства, эта функция устарела, и для вставки лучше использовать соединение с базой данных Drupal 8.

Устаревшее

начиная с Drupal 8.0.x, будет удален в Drupal 9.0.0. Вместо этого получите соединение с базой данных, внедренное в ваш сервис из контейнера, и вызовите insert () для него. Например, $ injected_database-> insert ($ table, $ options);

Теперь, как я могу получить соединение с базой данных и вызвать insert()метод?

Мохаммед Али Акбари
источник
Вы имеете в виду вне класса с инъекционными услугами? Как \Drupal::database()->insert(...);?
Клайв
Нет, я имею в виду внутри класса с инъекционными услугамиclass PetmdController extends ControllerBase
Мохаммед Али Акбари

Ответы:

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 вы хотите внедрить базу данных или любой другой сервис, который вам нужен, когда это возможно (когда вы находитесь в сервисе, контроллере, форме, плагине, ...)

Berdir
источник
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');
Vacho
источник