Selon _db_insert
_ page de manuel cette fonction est déconseillée et il est préférable d'utiliser Drupal 8 connexion à la base de données 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 appeler la méthode insert()
?
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();
}
}
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 core/lib/Drupal/Core/Database/Query
classes pour plus d'informations
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 pas supprimé de Drupal 8 jamais.
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, ...)
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');