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 ?

Mohammad Ali Akbari
źródło
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();
  }
}
Clive
źródło
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

Shabir A.
źródło
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, ...)

Berdir
źródło
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');
vacho
źródło