How to use database prefixes and Drupal 9 insert() method

Я разрабатываю специальный модуль для сайта Drupal 9. Я пытаюсь выполнить INSERT в удаленной базе данных PostgreSQL. Так...

База данных имеет несколько схем: общедоступная, содержимое, офис, ... Итак, в sites/default/settings.php У меня есть это:

$databases['remotedb']['default'] = array (
  'database' => 'mydatabase',
  'username' => 'user',
  'password' => 'pass123',
  'prefix' => '',
  'host' => '123.456.78.901',
  'port' => '5432',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\pgsql',
  'driver' => 'pgsql',
);
$databases['remotedb']['office'] = array (
  'database' => 'mydatabase',
  'username' => 'user',
  'password' => 'pass123',
  'prefix' => 'office.',
  'host' => '123.456.78.901',
  'port' => '5432',
  'namespace' => 'Drupal\\Core\\Database\\Driver\\pgsql',
  'driver' => 'pgsql',
);

Я выполнил успешные запросы SELECT, используя ['remotedb']['default'], например:

$db = \Drupal\Core\Database\Database::getConnection('default', 'remotedb');
$q = $db->query("SELECT price FROM contents.categories WHERE id=:categoryId", [':categoryId' => $categoryId]);
$res = $q->fetchCol();

Теперь я пытаюсь выполнить INSERT, используя insert()метод, как это рекомендовано в Drupal Docs. Сначала у меня не было задано ['remotedb']['office'], поэтому у меня были такие ошибки, как "таблица не существует".
Итак, после исследования я подумал, что должен использовать prefixи вот как ['remotedb']['office'] оказался в settings.php.
Мой код INSERT теперь выглядит так:

$db = \Drupal\Core\Database\Database::getConnection('office', 'remotedb');
$q = $db->insert('credits')->fields(['amount' => $amount,'type' => $type,]);
$res = $q->execute();

Но я получаю эту ошибку $res = $q->execute(); линия:

Drupal\Core\Database\DatabaseExceptionWrapper: SQLSTATE[42602]: Invalid name: 7 ERROR: 
invalid name syntax LINE 6: AND pg_attribute.attrelid = '."office"."credits"'::re... ^: 
SELECT pg_attribute.attname AS column_name, format_type(pg_attribute.atttypid, pg_attribute.atttypmod) AS data_type, 
pg_get_expr(pg_attrdef.adbin, pg_attribute.attrelid) AS column_default 
FROM pg_attribute LEFT JOIN pg_attrdef ON pg_attrdef.adrelid = pg_attribute.attrelid AND pg_attrdef.adnum = pg_attribute.attnum 
WHERE pg_attribute.attnum > 0 AND NOT pg_attribute.attisdropped AND pg_attribute.attrelid = :key::regclass 
AND (format_type(pg_attribute.atttypid, pg_attribute.atttypmod) = 'bytea' OR
pg_get_expr(pg_attrdef.adbin, pg_attribute.attrelid) LIKE 'nextval%'); 
Array ( [:key] => ."office"."credits" ) 
in Drupal\myoffice\Service\CreditFunctions->addCredit() (line 91 of modules/custom/myoffice/src/Service/CreditFunctions.php). 

Это сводит меня с ума. Я пробовал несколько вещей, но ничего не помогло. В конце концов я получаю ту же ошибку.
Единственный способ выполнить этот INSERT - это использовать query(), и нет insert() метод.

Думаю, мои вопросы будут такими:

  1. возможно ли выполнить INSERT с помощью DatabaseAPI insert()метод для таблицы с префиксом (в непубличной схеме)? Что я делаю неправильно? что мне не хватает?
  2. как следует prefix использоваться в insert() метод?

0 ответов

Другие вопросы по тегам