Poszukuję przykładu wstawienia bazy danych


12

Według db_insertstrony podręcznika funkcja ta jest przestarzała i lepiej jest użyć połączenia z bazą danych Drupal 8 do wykonania wstawiania.

Przestarzałe

od Drupal 8.0.x zostanie usunięty w Drupal 9.0.0. Zamiast tego uzyskaj połączenie bazy danych wstrzyknięte do twojej usługi z kontenera i wywołaj na niej insert (). Na przykład $ injected_database-> insert ($ table, $ options);

Jak mogę uzyskać połączenie z bazą danych i insert()metodę wywołania ?


Masz na myśli poza klasą z zastrzykami usług? Jak \Drupal::database()->insert(...);?
Clive

Nie, mam na myśli klasę wewnętrzną z wstrzykiwanymi usługamiclass PetmdController extends ControllerBase
Mohammad Ali Akbari

Odpowiedzi:


19

Aby wstrzyknąć usługę bazy danych, dodaj / zmień następujące metody w klasie kontrolera:

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

Działa to doskonale w przypadku ControllerBase, ale w jaki sposób wstrzyknęłbym usługę bazy danych, gdyby moja klasa rozszerzyła ContentEntityBase, która już przekazuje różne zmienne do konstrukcji?
Felix Eve

3

Aby dodać do Berdira odpowiedź tutaj brzmi: jak wstrzyknąć usługę bazy danych do kontrolera

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

Możesz studiować core/lib/Drupal/Core/Database/Queryzajęcia, aby uzyskać więcej informacji


2

Po pierwsze, jak mówi cytat, jest on nieaktualny dla Drupala 9 . Co oznacza, że ​​pozostanie przez lata i nie zostanie nigdy usunięty z Drupala 8.

Ale tak, dobrym pomysłem jest unikanie przestarzałych funkcji. Jak każda inna przestarzała funkcja, zawsze możesz po prostu spojrzeć na jej implementację, aby zobaczyć, jak wygląda nowy sposób jej działania. Chociaż zamiast dzwonić do \ Drupal, chcesz wstrzyknąć bazę danych lub inną usługę, której potrzebujesz, gdy jest to możliwe (gdy jesteś w usłudze, kontrolerze, formularzu, wtyczce, ...)


1

Opcja 1:

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

Opcja 2

$db = \Drupal::database();
$data = $db->query('SELECT idpr, name, code, detail FROM k_product')->fetchAllAssoc('idpr', 'name');
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.