Recherche d'un exemple d'insertion de base de données

12

Selon db_insertla page de manuel, cette fonction est obsolète et il est préférable d'utiliser la connexion à la base de données Drupal 8 pour effectuer l'insertion.

Obsolète

à partir de Drupal 8.0.x, sera supprimé dans Drupal 9.0.0. Au lieu de cela, obtenez une connexion à la base de données injectée dans votre service à partir du conteneur et appelez insert () dessus. Par exemple, $ injected_database-> insert ($ table, $ options);

Maintenant, comment puis-je obtenir une connexion à une base de données et une insert()méthode d' appel ?

Mohammad Ali Akbari
la source
Voulez-vous dire en dehors d'une classe avec des services injectés? Comme \Drupal::database()->insert(...);?
Clive
Non, je veux dire à l'intérieur de la classe avec des services injectésclass PetmdController extends ControllerBase
Mohammad Ali Akbari

Réponses:

19

Pour injecter le service de base de données, ajoutez / modifiez les méthodes suivantes dans votre classe de contrôleur:

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
la source
Cela fonctionne très bien pour ControllerBase, mais comment injecter le service de base de données si ma classe étendait ContentEntityBase qui transmet déjà différentes variables à la construction?
Felix Eve
3

Pour ajouter à la réponse de Berdir, voici comment vous pouvez injecter votre service de base de données dans votre contrôleur

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

Vous pouvez étudier les core/lib/Drupal/Core/Database/Querycours pour plus d'informations

Shabir A.
la source
2

Tout d'abord, comme votre citation l'indique, il est obsolète pour Drupal 9 . Ce qui signifie qu'il restera en place pendant des années et ne sera jamais supprimé de Drupal 8.

Mais oui, c'est une bonne idée pour éviter les fonctions obsolètes. Comme toute autre fonction obsolète, vous pouvez toujours simplement regarder son implémentation pour voir comment la nouvelle façon de le faire est. Bien qu'au lieu d'appeler à \ Drupal, vous souhaitez injecter la base de données ou tout autre service dont vous avez besoin lorsque cela est possible (lorsque vous êtes dans un service, contrôleur, formulaire, plugin, ...)

Berdir
la source
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
la source