【发布时间】:2012-05-15 07:41:41
【问题描述】:
在使用 $entityManager->find('entity', id) 时,有没有办法使用 Doctrine 2 自动引用保留字?
使用查询构建器时可以这样做,但应该有一个全局配置设置来执行此操作吗?我不想在保留字的注释中指定它。
【问题讨论】:
标签: doctrine-orm
在使用 $entityManager->find('entity', id) 时,有没有办法使用 Doctrine 2 自动引用保留字?
使用查询构建器时可以这样做,但应该有一个全局配置设置来执行此操作吗?我不想在保留字的注释中指定它。
【问题讨论】:
标签: doctrine-orm
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
就是这样:)
【讨论】:
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());
【讨论】:
这是我不久前向 Doctrine 团队提出的一个问题。
https://github.com/doctrine/doctrine2/issues/2409
票已关闭并发表评论:
您必须使用 @Column(name="`integer`") 手动转义字符
所以我猜你需要处理注释中的任何保留关键字
【讨论】:
根据@tim-lytle 的声明,我重新提出了这个问题。这确实应该包含在 Doctrine ORM 的安全范围内。
【讨论】: