Шукаємо приклад вставки бази даних


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

Тут можна додати відповідь Бердіра - як ви можете ввести службу бази даних у свій контролер

$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');
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.