有没有办法在使用时自动引用Doctrine 2的保留字$entityManager->find('entity', id)
?
使用查询构建器时可以这样做但是应该有一个全局配置设置来执行此操作吗?我不想在保留字的注释中指定它.
Lee*_*vis 76
这是我与Doctrine团队提出的一个问题.
https://github.com/doctrine/doctrine2/issues/2409
机票已关闭,评论如下:
你必须用@Column手动转义字符(name ="`integer`")
所以我想你需要处理注释中的任何保留关键字
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)
它不是由 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)
就这些 :)
归档时间: |
|
查看次数: |
18917 次 |
最近记录: |