Я пытаюсь сохранить данные в 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',
Схема указывает на общественность.
Это сработало!