使用Doctrine 2自动引用保留字

时间:2012-05-06 14:21:02

标签: doctrine-orm

使用$entityManager->find('entity', id)

时,是否可以使用Doctrine 2自动引用保留字?

使用查询构建器时可以这样做但是应该有一个全局配置设置来执行此操作吗?我不想在保留字的注释中指定它。

4 个答案:

答案 0 :(得分:71)

这是我向Doctrine团队提出的一个问题。

https://github.com/doctrine/doctrine2/issues/2409

票证已关闭,注释:

  

您必须使用@Column(name =“`integer`”)

手动转义字符

所以我猜你需要处理注释中的任何保留关键字

答案 1 :(得分:7)

4.6。引用保留字

由于保留字冲突,有时需要引用列或表名。 Doctrine不会自动引用标识符,因为它会导致比解决方案更多的问题。引用表和列名称需要使用定义中的tick来明确地完成。

<?php
/** @Column(name="`number`", type="integer") */
private $number;
然后,

Doctrine将根据使用的数据库平台在所有SQL语句中引用此列名。

标识符引用不适用于连接列名称或鉴别器列名称,除非您使用自定义QuoteStrategy。

为了更好地控制列引用,在2.3中引入了Doctrine\ORM\Mapping\QuoteStrategy接口。它为每个列,表,别名和其他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

答案 2 :(得分:2)

它不是由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
}  

然后,将您的报价策略注册为服务:

<强>的src /的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

这就是全部:)

答案 3 :(得分:0)

根据@ tim-lytle所作的陈述,我重新提出了这个问题。这应该包含在Doctrine ORM的安全范围内。

https://github.com/doctrine/doctrine2/issues/5874