Beispiel für Datenbankeinfügung suchen

12

Laut db_insertHandbuchseite ist diese Funktion veraltet und es ist besser, die Drupal 8-Datenbankverbindung zum Einfügen zu verwenden.

Veraltet

ab Drupal 8.0.x wird es in Drupal 9.0.0 entfernt. Laden Sie stattdessen eine Datenbankverbindung aus dem Container in Ihren Dienst und rufen Sie insert () auf. Zum Beispiel $ injected_database-> insert ($ table, $ options);

Wie kann ich nun eine Datenbankverbindung und eine insert()Aufrufmethode erhalten?

Mohammad Ali Akbari
quelle
Meinen Sie außerhalb einer Klasse mit injizierten Diensten? Wie \Drupal::database()->insert(...);?
Clive
Nein, ich meine in der Klasse mit injizierten Dienstenclass PetmdController extends ControllerBase
Mohammad Ali Akbari

Antworten:

19

Fügen Sie zum Injizieren des Datenbankdienstes die folgenden Methoden in Ihre Controller-Klasse ein / ändern Sie sie:

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
quelle
Dies funktioniert gut für ControllerBase, aber wie würde ich den Datenbankdienst injizieren, wenn meine Klasse ContentEntityBase erweitern würde, das bereits verschiedene Variablen in das Konstrukt übergibt?
Felix Eve
3

Um die Berdir-Antwort hier hinzuzufügen, können Sie Ihren Datenbankdienst in Ihren Controller einfügen

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

Sie können core/lib/Drupal/Core/Database/QueryKlassen für weitere Informationen studieren

Shabir A.
quelle
2

Erstens, wie Ihr Zitat sagt, ist es für Drupal 9 veraltet . Dies bedeutet, dass es jahrelang bestehen bleibt und niemals von Drupal 8 entfernt wird.

Aber ja, es ist eine gute Idee, veraltete Funktionen zu vermeiden. Wie bei jeder anderen veralteten Funktion können Sie auch bei der Implementierung immer einfach nachsehen, wie die neue Vorgehensweise aussieht. Anstatt \ Drupal anzurufen, möchten Sie die Datenbank oder einen anderen Dienst, den Sie benötigen, einbinden, wenn dies möglich ist (wenn Sie sich in einem Dienst, einem Controller, einem Formular, einem Plugin usw. befinden).

Berdir
quelle
1

Option 1:

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

Option 2

$db = \Drupal::database();
$data = $db->query('SELECT idpr, name, code, detail FROM k_product')->fetchAllAssoc('idpr', 'name');
vacho
quelle