Автозапись зарезервированных слов с помощью Doctrine 2
Есть ли способ автозапуска зарезервированных слов с Doctrine 2 при использовании $entityManager->find('entity', id)
?
При использовании построителя запросов это можно сделать, но для этого должен быть глобальный параметр конфигурации? Я не хочу указывать его в аннотациях для зарезервированных слов.
Ответы
Ответ 1
Это была проблема, которую я поднял некоторое время назад с командой Doctrine.
https://github.com/doctrine/doctrine2/issues/2409
Билет был закрыт с комментарием:
Вам нужно вручную вывести символы с помощью @Column (name= "` integer`" )
Итак, я думаю, вам нужно иметь дело с любыми зарезервированными ключевыми словами в ваших аннотациях
Ответ 2
4,6. Цитирование зарезервированных слов
Иногда необходимо указывать имя столбца или таблицы из-за конфликтов зарезервированных слов. Doctrine не цитирует идентификаторы автоматически, потому что это приводит к большему количеству проблем, чем это могло бы решить. Цитирование имен таблиц и столбцов должно выполняться явно с использованием тиков в определении.
<?php
/** @Column(name="`number`", type="integer") */
private $number;
Затем Doctrine цитирует это имя столбца во всех операциях SQL в соответствии с используемой базой данных.
Идентификатор Quoting не работает для имен столбцов объединения или имен столбцов дискриминатора, если вы не используете пользовательскую QuoteStrategy.
Для большего контроля над столбцом, цитирующим интерфейс Doctrine\ORM\Mapping\QuoteStrategy
, был введен в 2.3. Он вызывается для каждого столбца, таблицы, псевдонима и других имен SQL. Вы можете реализовать QuoteStrategy и установить его, вызвав Doctrine\ORM\Configuration#setQuoteStrategy()
.
Добавлена стратегия цитирования ANSI, которая предполагает, что цитирование не требуется для любого имени SQL. Вы можете использовать его со следующим кодом:
<?php
use Doctrine\ORM\Mapping\AnsiQuoteStrategy;
$configuration->setQuoteStrategy(new AnsiQuoteStrategy());
http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#quoting-reserved-words
Ответ 3
В заявлении, сделанным @tim-lytle, я повторно поднял проблему. Это действительно должно быть включено в сферу безопасности Doctrine ORM.
https://github.com/doctrine/doctrine2/issues/5874
Ответ 4
Он не реализован Doctrine только потому, что он тоже зависит от платформы.
Все, что вам нужно, реализует собственную QuoteStrategy.
Например, для проекта symfony:
Скопировать-вставить поставщика AnsiQuoteStrategy
класс, переименовать его и сделать некоторые кавычки:
AppBundle/ORM/QuoteStrategy.php
namespace AppBundle\ORM;
use Doctrine\DBAL\Platforms\AbstractPlatform;
use Doctrine\ORM\Mapping as M;
class QuoteStrategy implements M\QuoteStrategy
{
private function quote($token, AbstractPlatform $platform)
{
// implement your quote strategy
switch ($platform->getName()) {
case 'mysql':
default:
return '`' . $token . '`';
}
}
// add quoting to appropriate methods
public function getColumnName($fieldName, M\ClassMetadata $class, AbstractPlatform $platform)
{
return $this->quote($class->fieldMappings[$fieldName]['columnName'], $platform);
}
// ... Rest methods
}
Затем зарегистрируйте свою стратегию цитаты как услугу:
ЦСИ/AppBundle/Ресурсы/конфигурации/services.yml
app.orm.quote_strategy:
class: AppBundle\ORM\QuoteStrategy
public: false
Затем используйте его для вашей конфигурации entitymanager:
app/config/config.yml
orm:
entity_managers:
default:
quote_strategy: app.orm.quote_strategy
Вот и все:)