Подтвердить что ты не робот

Автозапись зарезервированных слов с помощью Doctrine 2

Есть ли способ автозапуска зарезервированных слов с Doctrine 2 при использовании $entityManager->find('entity', id)?

При использовании построителя запросов это можно сделать, но для этого должен быть глобальный параметр конфигурации? Я не хочу указывать его в аннотациях для зарезервированных слов.

4b9b3361

Ответ 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

Вот и все:)