有没有办法在使用 Doctrine 2 时自动引用保留字$entityManager->find('entity', id)
?
使用查询生成器时可以这样做,但应该有一个全局配置设置来做到这一点?我不想在保留字的注释中指定它。
有没有办法在使用 Doctrine 2 时自动引用保留字$entityManager->find('entity', id)
?
使用查询生成器时可以这样做,但应该有一个全局配置设置来做到这一点?我不想在保留字的注释中指定它。
这是我不久前在 Doctrine 团队中提出的一个问题。
https://github.com/doctrine/doctrine2/issues/2409
票已关闭,评论如下:
您必须使用 @Column(name="`integer`") 手动转义字符
所以我想你需要处理注释中的任何保留关键字
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());
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
就这些 :)
根据@tim-lytle 的声明,我重新提出了这个问题。这确实应该包含在 Doctrine ORM 的安全范围中。