データベース挿入の例を探しています


12

db_insertマニュアルページによると、この機能は非推奨であり、挿入を実行するにはDrupal 8データベース接続を使用することをお勧めします。

非推奨

Drupal 8.0.xの時点で、Drupal 9.0.0で削除されます。代わりに、コンテナからサービスにデータベース接続を挿入し、それに対してinsert()を呼び出します。たとえば、$ injected_database-> insert($ table、$ options);

データベース接続を取得してinsert()メソッドを呼び出すにはどうすればよいですか?


サービスが注入されたクラスの外を意味しますか?好き\Drupal::database()->insert(...);
クライブ

注入されたサービスで、私の平均内のクラスはありませんclass PetmdController extends ControllerBase
モハマド・アリAkbari

回答:


19

データベースサービスを挿入するには、コントローラークラスに次のメソッドを追加/変更します。

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

これはControllerBaseでうまく機能しますが、クラスが既に異なる変数をコンストラクトに渡しているContentEntityBaseを拡張している場合、どのようにデータベースサービスを注入しますか?
フェリックスイブ

3

Berdirに答えを追加するには、ここでデータベースサービスをコントローラーに注入する方法があります

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

core/lib/Drupal/Core/Database/Query詳細についてはクラスを勉強できます


2

最初に、あなたの引用が言うように、それはDrupal 9では非推奨です。つまり、何年も存続し、Drupal 8から削除されることはありません。

しかし、はい、廃止された機能を避けるのは良い考えです。他の非推奨の関数と同様に、いつでも実装を見て、新しい方法がどのように機能するかを確認できます。\ Drupalを呼び出す代わりに、データベースまたはそれが可能なときに必要な他のサービス(サービス、コントローラー、フォーム、プラグインなど)をインジェクトします。


1

オプション1:

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

オプション2

$db = \Drupal::database();
$data = $db->query('SELECT idpr, name, code, detail FROM k_product')->fetchAllAssoc('idpr', 'name');
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.