Mencari contoh memasukkan basis data

12

Menurut db_inserthalaman manual fungsi ini sudah tidak digunakan lagi dan lebih baik menggunakan koneksi database Drupal 8 untuk melakukan insert.

Usang

pada Drupal 8.0.x, akan dihapus dalam Drupal 9.0.0. Alih-alih, dapatkan koneksi basis data yang disuntikkan ke layanan Anda dari wadah dan masukkan panggilan () di dalamnya. Misalnya, $ injected_database-> insert ($ table, $ options);

Sekarang bagaimana saya bisa mendapatkan koneksi basis data dan insert()metode panggilan ?

Mohammad Ali Akbari
sumber
Maksud Anda di luar kelas dengan layanan injeksi? Suka \Drupal::database()->insert(...);?
Clive
Tidak maksud saya di dalam kelas dengan layanan injeksiclass PetmdController extends ControllerBase
Mohammad Ali Akbari

Jawaban:

19

Untuk menyuntikkan layanan database, tambahkan / ubah metode berikut di kelas controller Anda:

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
sumber
Ini berfungsi baik untuk ControllerBase, tetapi bagaimana saya menyuntikkan layanan database jika kelas saya memperluas ContentEntityBase yang sudah melewati variabel berbeda ke dalam konstruk?
Felix Eve
3

Untuk menambahkan jawaban Berdir di sini adalah bagaimana Anda dapat menyuntikkan layanan database Anda di controller Anda

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

Anda dapat mempelajari core/lib/Drupal/Core/Database/Querykelas untuk informasi lebih lanjut

Shabir A.
sumber
2

Pertama, seperti kutipan Anda katakan, itu sudah usang untuk Drupal 9 . Yang berarti akan tetap ada selama bertahun-tahun dan tidak akan pernah dihapus dari Drupal 8.

Tapi ya, itu ide yang bagus untuk menghindari fungsi yang sudah usang. Seperti fungsi usang lainnya, Anda selalu dapat dengan mudah melihat implementasinya untuk melihat bagaimana cara baru melakukannya. Meskipun alih-alih memanggil \ Drupal, Anda ingin menyuntikkan database atau layanan lain apa pun yang Anda perlukan saat itu mungkin (ketika Anda berada di layanan, pengontrol, formulir, plugin, ...)

Berdir
sumber
1

Pilihan 1:

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

pilihan 2

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