【问题标题】:Auto quote reserved words with Doctrine 2使用 Doctrine 2 自动引用保留字
【发布时间】:2012-05-15 07:41:41
【问题描述】:

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

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

【问题讨论】:

    标签: doctrine-orm


    【解决方案1】:

    Doctrine 没有实现它只是因为它过于依赖平台。

    您所需要的只是实现自己的 QuoteStrategy。

    例如,对于 symfony 项目:


    复制粘贴 vendor 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
    

    就是这样:)

    【讨论】:

      【解决方案2】:

      4.6。引用保留字

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

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

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

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

      2.3 中引入了对引用 Doctrine\ORM\Mapping\QuoteStrategy 接口的列的更多控制。它为每个列、表、别名和其他 SQL 名称调用。您可以通过调用Doctrine\ORM\Configuration#setQuoteStrategy() 来实现并设置QuoteStrategy。

      添加了 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】:

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

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

        票已关闭并发表评论:

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

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

        【讨论】:

        • 恕我直言,这里被打破了。系统不会为您逃脱的任何其他地方都将被称为 SQL 注入漏洞。
        • 2 年改变,仍然是同样的问题:您可以创建一个包含名为“primary”的列的表,但您将无法使用此表。在我看来,DBAL 让用户完成这样的基本任务并不正常。
        • 在我看来,不转义列名是一种贫民窟。多年来我使用了几个 ORM,这个问题只出现在 Doctrine 中。我遇到了这个问题,因为我有一个名为“组”的列。
        • 这个问题很傻。由于保留关键字,我不能使用表名“release”。即使使用“`”,也没有找到解决方法。我不喜欢复数表名,但由于这个问题,在我找到解决方法之前,我有一个复数表名。把我的强迫症逼疯了。
        • 不敢相信这个问题被关闭为无效o.O
        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多