57

有没有办法在使用 Doctrine 2 时自动引用保留字$entityManager->find('entity', id)

使用查询生成器时可以这样做,但应该有一个全局配置设置来做到这一点?我不想在保留字的注释中指定它。

4

4 回答 4

89

这是我不久前在 Doctrine 团队中提出的一个问题。

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

票已关闭,评论如下:

您必须使用 @Column(name="`integer`") 手动转义字符

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

于 2012-05-07T14:14:10.293 回答
22

4.6. 引用保留字

由于保留字冲突,有时需要引用列名或表名。Doctrine 不会自动引用标识符,因为它导致的问题多于解决的问题。引用表和列名需要使用定义中的刻度显式完成。

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

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

除非您使用自定义 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

于 2017-04-23T10:53:28.883 回答
7

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/Resources/config/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

就这些 :)

于 2017-10-31T13:05:51.853 回答
3

根据@tim-lytle 的声明,我重新提出了这个问题。这确实应该包含在 Doctrine ORM 的安全范围中。

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

于 2016-06-14T23:07:58.963 回答