CakePHP 3 + ORM Query Builder и экранирование имени столбца

Я уже переписал какое-то приложение с CakePHP 2 на CakePHP 3. У меня есть некоторая структура в базе данных со столбцом: ключ (автогенерируемая ключевая строка). В mysql ключ - это ключевое слово, поэтому, когда я пишу SQL-запрос, мне приходится экранировать его как

INSERT INTO table (`key`) VALUES (....)

К сожалению, когда я пытаюсь сохранить Entity, я получаю сообщение об ошибке:

[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'key, 

Эта ошибка возникает в Cake\ORM\Table в методе _insert() в этом месте:

$statement = $this->query()->insert(array_keys($data))
        ->values($data)
        ->execute();

Любые предложения, как избежать этой ситуации? CakePHP версии 3.5.11


person plugowski    schedule 05.02.2018    source источник
comment
кажется, проблема в вашем mariadb, может быть, вам нужно убрать скобки.   -  person danilo    schedule 05.02.2018
comment
Хорошо, я погуглил глубже и обнаружил, что проблема была в следующем: quoteIdentifiers параметр в конфигурации базы данных. Он должен быть установлен на true.   -  person plugowski    schedule 06.02.2018


Ответы (1)


Либо переименуйте столбец, чтобы избежать этого конфликта, либо включите автоматическое цитирование идентификаторов CakePHP, либо глобально в конфигурации подключения к базе данных с помощью параметра quoteIdentifiers:

// in config/app.php

'Datasources' => [
    'default' => [
        // ...
        'quoteIdentifiers' => true,
    ],

    // ...
]

или только для этой конкретной операции, переключая флаг автоматического цитирования драйверов на лету:

$driver = $this->getConnection()->getDriver();
$autoQuouting = $driver->isAutoQuotingEnabled();
$driver->enableAutoQuoting(true);

$this->query()/* ... */;

$driver->enableAutoQuoting($autoQuouting);

или вручную заключая имя в кавычки и передавая его в кавычках:

$connection = $this->getConnection();
$quotedColumnName = $connection->quoteIdentifier($columnName);
// ...

в настоящее время это совместимо с автоматическим цитированием, т. е. имя в кавычках не будет цитироваться дважды, если будет включено автоматическое авотирование, но я не уверен, что это действительно обещанное поведение!

Смотрите также

person ndm    schedule 05.02.2018