Veritabanı ekleme örneği aranıyor


12

db_insertManuel sayfaya göre bu işlev kullanımdan kaldırılmıştır ve ekleme yapmak için Drupal 8 veritabanı bağlantısını kullanmak daha iyidir.

Kaldırıldı

Drupal 8.0.x itibariyle Drupal 9.0.0'da kaldırılacaktır. Bunun yerine, kaptan hizmetinize bir veritabanı bağlantısı alın ve üzerinde insert () çağırın. Örneğin, $ injected_database-> insert ($ tablosu, $ seçenekleri);

Şimdi bir veritabanı bağlantısı ve çağrı insert()yöntemi nasıl alabilirim ?


Enjekte edilmiş hizmetleri olan bir sınıfın dışında mı demek istiyorsun? Gibi \Drupal::database()->insert(...);mi?
Clive

Hayır, enjekte edilmiş hizmetlerle sınıf içi demek class PetmdController extends ControllerBase
istedim

Yanıtlar:


19

Veritabanı hizmetini enjekte etmek için denetleyici sınıfınıza aşağıdaki yöntemleri ekleyin / değiştirin:

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();
  }
}

Bu ControllerBase için harika çalışıyor, ancak sınıfım zaten yapıya farklı değişkenler geçiren ContentEntityBase'yi genişletiyorsa veritabanı hizmetini nasıl enjekte ederim?
Felix Eve

3

Berdir cevabına eklemek için burada veritabanı hizmetinizi kumandanıza nasıl enjekte edebilirsiniz

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

Daha core/lib/Drupal/Core/Database/Queryfazla bilgi için ders çalışabilirsiniz


2

İlk olarak, teklifinizin söylediği gibi, Drupal 9 için kullanımdan kaldırıldı . Yani yıllarca kalacak ve Drupal 8'den hiç çıkarılmayacak.

Ancak evet, kullanımdan kaldırılmış işlevlerden kaçınmak iyi bir fikirdir. Herhangi bir kullanımdan kaldırılmış işlev gibi, yeni yapmanın nasıl olduğunu görmek için her zaman uygulamasına bakabilirsiniz. \ Drupal çağrısı yapmak yerine, veritabanını veya mümkün olduğunda ihtiyacınız olan diğer hizmetleri (bir hizmette, denetleyicide, formda, eklentide, ...) enjekte etmek istersiniz.


1

Seçenek 1:

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

seçenek 2

$db = \Drupal::database();
$data = $db->query('SELECT idpr, name, code, detail FROM k_product')->fetchAllAssoc('idpr', 'name');
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.