Heroku Connect with Cakephp v3.0.12

Я пытаюсь сохранить данные в Heroku Postgres, который также использует для подключения героя к Salesforce.

У меня есть ошибка, которая говорит

Error: [PDOException] SQLSTATE[42883]: Undefined function: 7 ERROR: function get_xmlbinary() does not exist LINE 1: SELECT (get_xmlbinary() = 'base64') HINT: No function matches the given name and argument types. You might need to add explicit type casts. QUERY: SELECT (get_xmlbinary() = 'base64') CONTEXT: PL/pgSQL function hc_contact_status() line 3 at IF Request URL: /signup 

и это трассировка стека

  #0 app/vendor/cakephp/cakephp/src/Database/Statement/StatementDecorator.php(169): PDOStatement->execute(NULL) #1 app/vendor/cakephp/cakephp/src/Database/Connection.php(274): Cake\Database\Statement\StatementDecorator->execute() #2 app/vendor/cakephp/cakephp/src/Database/Query.php(176): Cake\Database\Connection->run(Object(Cake\ORM\Query)) #3 app/vendor/cakephp/cakephp/src/ORM/Table.php(1516): Cake\Database\Query->execute() #4 app/vendor/cakephp/cakephp/src/ORM/Table.php(1436): Cake\ORM\Table->_insert(Object(App\Model\Entity\Contact), Array) #5 app/vendor/cakephp/cakephp/src/ORM/Table.php(1367): Cake\ORM\Table->_processSave(Object(App\Model\Entity\Contact), Object(ArrayObject)) #6 app/vendor/cakephp/cakephp/src/Database/Connection.php(561): Cake\ORM\Table->Cake\ORM\{closure}(Object(Cake\Database\Connection)) #7 app/vendor/cakephp/cakephp/src/ORM/Table.php(1368): Cake\Database\Connection->transactional(Object(Closure)) #8 app/src/Controller/ContactController.php(126): Cake\ORM\Table->save(Object(App\Model\Entity\Contact)) #9 [internal function]: App\Controller\ContactController->signup('signup') #10 app/vendor/cakephp/cakephp/src/Controller/Controller.php(412): call_user_func_array(Array, Array) #11 /app/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(114): Cake\Controller\Controller->invokeAction() #12 app/vendor/cakephp/cakephp/src/Routing/Dispatcher.php(87): Cake\Routing\Dispatcher->_invoke(Object(App\Controller\ContactController)) #13 app/webroot/index.php(37): Cake\Routing\Dispatcher->dispatch(Object(Cake\Network\Request), Object(Cake\Network\Response)) #14 {main} 

Блок базы данных в моем приложении app.php

 'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Postgres', 'persistent' => false, 'host' => '[ host name for the heroku postgre ]', 'port' => '5432', 'username' => '[ user name for the heroku postgre ]', 'password' => '[ password for the heroku postgre ]', 'database' => '[ database for the heroku postgre ]', 'encoding' => 'utf8', 'timezone' => 'UTC', 'schema' => 'salesforce', 'cacheMetadata' => false, 'log' => false, 'quoteIdentifiers' => false, ], 

В этом параметре я могу получить данные из соединения Heroku, но когда я пытаюсь что-то написать в БД, он вернет ошибку, указанную выше.

Я нашел Q и A для пользователя Lavera, и я думаю, что у меня такая же ситуация. https://discussion.heroku.com/t/heroku-connect-with-laravel/1335

Я думаю, что Schema => 'salseforce' должен быть «общедоступным», но я не знаю, как изменить настройку в среде CakePHP.

Я также запускал

 # set search_path=salesforce, public; 

Если кто-то знает решение для CakePHP, пожалуйста, дайте мне знать. я ценю вашу помощь

Обновить:

Я получил ответ от поддержки Heroku, и они дали мне хорошую идею для решения этого вопроса.

Ниже приведены ответы и отзыв герою

Почему это произошло?

  this error is usually a result of an application incorrectly setting search_path and ignoring the public schema. Running set search_path salesforce,public in psql only sets it for the current session. 

Как решить этот вопрос?

  Datasources:default:schema => 'public' rather than salesforce and then use fully qualified table names elsewhere in your application. 

или

  you could set schema => 'salesforce,public' 

Обратите внимание, что он не был профессионалом в среде CakePHP, поэтому он не уверен, работает ли второй метод или нет.

но я думаю, что могу сделать первый метод.

Если у вас есть идея об этом или что-то поделитесь на эту тему, прокомментируйте ниже

[Дополнительное обновление и решение]

Я просто попробовал, что сказал поддержка герою. Я отредактировал конструктор в модели, как показано ниже (в моем случае я сделал контактную модель)

 public function initialize(array $config) { parent::initialize($config); // added "salesforce" for following table name $this->table('salesforce.account'); $this->displayField('name'); $this->primaryKey('id'); } 

и в файле app.php

 'schema' => 'public', 

Схема указывает на общественность.

Это сработало!