Buscando ejemplo de inserción de base de datos

12

Según db_insertla página del manual, esta función está en desuso y es mejor usar la conexión de base de datos Drupal 8 para realizar la inserción.

Obsoleto

a partir de Drupal 8.0.x, se eliminará en Drupal 9.0.0. En su lugar, obtenga una conexión de base de datos inyectada en su servicio desde el contenedor y llame a insert () en él. Por ejemplo, $ injected_database-> insert ($ table, $ options);

Ahora, ¿cómo puedo obtener una conexión de base de datos y un insert()método de llamada ?

Mohammad Ali Akbari
fuente
¿Quieres decir fuera de una clase con servicios inyectados? Al igual que \Drupal::database()->insert(...);?
Clive
No, quiero decir dentro de la clase con servicios inyectadosclass PetmdController extends ControllerBase
Mohammad Ali Akbari

Respuestas:

19

Para inyectar el servicio de base de datos, agregue / modifique los siguientes métodos en su clase de controlador:

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
fuente
Esto funciona muy bien para ControllerBase, pero ¿cómo inyectaría el servicio de base de datos si mi clase extendiera ContentEntityBase que ya está pasando diferentes variables a la construcción?
Felix Eve
3

Para agregar a Berdir, la respuesta aquí es cómo puede inyectar su servicio de base de datos en su controlador

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

Puedes estudiar core/lib/Drupal/Core/Database/Queryclases para más información

Shabir A.
fuente
2

Primero, como dice su cita, está en desuso para Drupal 9 . Lo que significa que permanecerá durante años y no se eliminará de Drupal 8 nunca.

Pero sí, es una buena idea evitar funciones obsoletas. Al igual que cualquier otra función obsoleta, siempre puede simplemente mirar su implementación para ver cómo es la nueva forma de hacerlo. Aunque en lugar de llamar a \ Drupal, desea inyectar la base de datos o cualquier otro servicio que necesite cuando sea posible (cuando está en un servicio, controlador, formulario, complemento, ...)

Berdir
fuente
1

Opción 1:

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

opcion 2

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