2012-05-06 25 views
34

是否有使用$entityManager->find('entity', id)時的方式與原則2自動報價保留字?自動報價保留字2

當使用查詢生成器可以做到這一點,但應該有一個全局配置設置,做到這一點?我不想在保留字的註釋中指定它。

回答

57

這是我養了一段時間後與學說團隊的問題。

您有@Column(NAME = 「`integer`」)

所以我想手動轉義字符:

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

票證與評論關閉你需要在你的註釋

+0

我剛剛發現,該教條DBAL現在與cli工具\ Doctrine \ DBAL \ Tools \ Console \ Comma nd \ ReservedWordsCommand()這對於掃描實體可能會導致問題的任何事情非常有用。嘗試運行「doctrine dbal:保留字」來測試它。 –

+5

+1似乎很奇怪,創建表的工作正常。 –

+6

恕我直言主義在這裏被打破。任何其他地方,系統不會爲你逃脫,它將被稱爲SQL注入漏洞。 – rjmunro

3

4.6。引用保留字

有時需要引用,因爲保留字衝突的列或表名。 學說不會自動引用標識符,因爲它會導致比解決問題更多的問題。引用表和列名需要使用定義中的記號明確完成。

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

學說將在所有SQL語句根據所使用的數據庫平臺,然後舉這個列名。

ID引用不起作用,除非您使用的是自定義的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

0

它不是教條執行,只是因爲它太依賴於平臺的。

所有你需要的,是實現自己的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 /資源/配置/ services.yml

app.orm.quote_strategy: 
    class: AppBundle\ORM\QuoteStrategy 
    public: false 

然後,用它爲您的EntityManager配置:
應用程序/配置/ config.yml

orm: 
    entity_managers: 
    default: 
     quote_strategy: app.orm.quote_strategy 

這是所有:)