使用Doctrine 2自动引用保留字

Sam*_*nch 46 doctrine-orm

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

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

Lee*_*vis 76

这是我与Doctrine团队提出的一个问题.

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

机票已关闭,评论如下:

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

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

  • 在我看来,没有逃避列名称是一种贫民窟.多年来我使用了几个ORM,这个问题只出现在Doctrine中.我遇到了这个问题,因为我有一个名为'group'的列. (17认同)
  • 恕我直言的学说在这里打破了.在系统无法为您解决问题的任何其他地方,它将被称为SQL注入漏洞. (9认同)
  • 2年更改,仍然是同一个问题:您可以使用名为"primary"的列创建一个表,但之后您将无法使用此表.对于我来说,DBAL让这样的基本任务给用户看起来并不正常. (7认同)
  • +1似乎有点奇怪,创建表工作正常. (6认同)
  • 不能相信这个问题被关闭为无效的oO (5认同)
  • 这个问题非常愚蠢.由于保留关键字,我不能使用表名"release".即使使用"`",也没有找到解决方法.我不喜欢复数表名,但由于这个问题,直到我找到一个解决办法,我有一个复数表名.驾驶我的强迫症疯了. (4认同)

Sta*_*Fad 10

4.6.引用保留字

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

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

然后,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());
Run Code Online (Sandbox Code Playgroud)

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/basic-mapping.html#quoting-reserved-words


vp_*_*rth 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
}  
Run Code Online (Sandbox Code Playgroud)

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

src/AppBundle/Resources/config/services.yml

  app.orm.quote_strategy:
    class: AppBundle\ORM\QuoteStrategy
    public: false
Run Code Online (Sandbox Code Playgroud)

然后,将它用于您的 entitymanager 配置:
app/config/config.yml

orm:
  entity_managers:
    default:
      quote_strategy: app.orm.quote_strategy
Run Code Online (Sandbox Code Playgroud)

就这些 :)