Alla ricerca di un esempio di inserimento del database


12

Secondo db_insertla pagina del manuale questa funzione è obsoleta ed è meglio utilizzare la connessione al database Drupal 8 per eseguire l'inserimento.

Obsoleto

a partire da Drupal 8.0.x, verrà rimosso in Drupal 9.0.0. Invece, ottenere una connessione al database iniettata nel servizio dal contenitore e chiamare insert () su di esso. Ad esempio, $ injected_database-> insert ($ table, $ options);

Ora come posso ottenere una connessione al database e il insert()metodo di chiamata ?


Intendi al di fuori di una classe con servizi iniettati? Come \Drupal::database()->insert(...);?
Clive

No, intendo all'interno della classe con i servizi iniettaticlass PetmdController extends ControllerBase
Mohammad Ali Akbari,

Risposte:


19

Per iniettare il servizio di database aggiungere / modificare i seguenti metodi nella classe del controller:

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

Funziona alla grande con ControllerBase, ma come inietterei il servizio di database se la mia classe estendesse ContentEntityBase che sta già passando diverse variabili nel costrutto?
Felix Eve,

3

Aggiungere alla risposta Berdir qui è come è possibile iniettare il servizio di database nel controller

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

Puoi studiare le core/lib/Drupal/Core/Database/Querylezioni per maggiori informazioni


2

Innanzitutto, come dice la tua citazione, è deprecata per Drupal 9 . Ciò significa che rimarrà in circolazione per anni e non verrà mai rimosso da Drupal 8.

Sì, è una buona idea evitare funzioni deprecate. Come qualsiasi altra funzione deprecata, puoi sempre semplicemente guardare la sua implementazione per vedere come è il nuovo modo di farlo. Sebbene invece di chiamare \ Drupal, si desideri iniettare il database o qualsiasi altro servizio necessario quando ciò è possibile (quando ci si trova in un servizio, controller, modulo, plug-in, ...)


1

Opzione 1:

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

opzione 2

$db = \Drupal::database();
$data = $db->query('SELECT idpr, name, code, detail FROM k_product')->fetchAllAssoc('idpr', 'name');
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.