Procurando exemplo de inserção de banco de dados

12

De acordo com db_inserta página do manual, essa função está obsoleta e é melhor usar a conexão com o banco de dados Drupal 8 para executar a inserção.

Descontinuada

a partir do Drupal 8.0.x, será removido no Drupal 9.0.0. Em vez disso, injete uma conexão com o banco de dados no seu serviço a partir do contêiner e chame insert () nele. Por exemplo, $ injected_database-> insert ($ table, $ options);

Agora, como posso obter uma conexão com o banco de dados e chamar o insert()método?

Mohammad Ali Akbari
fonte
Você quer dizer fora de uma classe com serviços injetados? Gosta \Drupal::database()->insert(...);?
Clive
Não quero dizer classe dentro com serviços injetadosclass PetmdController extends ControllerBase
Mohammad Ali Akbari

Respostas:

19

Para injetar o serviço de banco de dados, adicione / altere os seguintes métodos na sua classe 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
fonte
Isso funciona muito bem no ControllerBase, mas como eu injetaria o serviço de banco de dados se minha classe estivesse estendendo o ContentEntityBase que já está passando variáveis ​​diferentes para a construção?
Felix Eve
3

Para adicionar à resposta do Berdir, aqui é como você pode injetar seu serviço de banco de dados no seu 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);

Você pode estudar core/lib/Drupal/Core/Database/Querypara obter mais informações

Shabir A.
fonte
2

Primeiro, como diz a sua citação, ele foi descontinuado para o Drupal 9 . O que significa que ele permanecerá por anos e nunca será removido do Drupal 8.

Mas sim, é uma boa ideia evitar funções obsoletas. Como qualquer outra função obsoleta, você sempre pode simplesmente olhar para sua implementação para ver como é a nova maneira de fazê-lo. Embora, em vez de chamar \ Drupal, você queira injetar o banco de dados ou qualquer outro serviço necessário, quando possível (quando você estiver em um serviço, controlador, formulário, plug-in, ...)

Berdir
fonte
1

Opção 1:

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

opção 2

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