2012-05-06 4 views
34

क्या $entityManager->find('entity', id) का उपयोग करते समय डॉक्ट्रिन 2 के साथ आरक्षित शब्दों को स्वत: उद्धृत करने का कोई तरीका है?डॉक्टर के साथ ऑटो उद्धरण आरक्षित शब्द 2

क्वेरी बिल्डर का उपयोग करते समय यह किया जा सकता है लेकिन वैश्विक कॉन्फ़िगरेशन सेटिंग होना चाहिए जो यह करता है? मैं आरक्षित शब्दों के लिए एनोटेशन में इसे निर्दिष्ट नहीं करना चाहता हूं।

उत्तर

57

यह एक मुद्दा था जिसे मैंने डॉक्टर टीम के साथ थोड़ी देर पहले उठाया था।

आप मैन्युअल @Column (नाम = "` integer` ")

तो मुझे लगता है कि साथ पात्रों से बचने के लिए है:

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

टिकट टिप्पणी के साथ बंद हो गया आपको अपनी टिप्पणियों में किसी भी आरक्षित कीवर्ड से निपटने की आवश्यकता होगी

+0

मुझे अभी पता चला है कि सिद्धांत डीबीएएल अब क्ली टूल \ Doctrine \ DBAL \ Tools \ Console \ Comma के साथ भेज दिया गया है nd \ ReservedWordsCommand() जो किसी भी समस्या के कारण आपकी संस्थाओं को स्कैन करने के लिए वास्तव में उपयोगी है। इसका परीक्षण करने के लिए "सिद्धांत डबल: आरक्षित शब्द" चलाने का प्रयास करें। –

+5

+1 अजीब लगता है कि तालिका बनाना ठीक काम करता है। –

+6

आईएमएचओ सिद्धांत यहां टूटा हुआ है। कहीं और जहां सिस्टम आपके लिए चीजें नहीं बचता है इसे एसक्यूएल इंजेक्शन भेद्यता कहा जाएगा। – rjmunro

0

@ टाइम-लाइटल द्वारा दिए गए बयान के अनुसार, मैंने इस मुद्दे को फिर से उठाया है। यह वास्तव में सिद्धांत ओआरएम के सुरक्षा के दायरे के साथ शामिल किया जाना चाहिए।

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

3

4,6। आरक्षित शब्दों का उद्धरण

कभी-कभी आरक्षित शब्द विवादों के कारण कॉलम या तालिका नाम उद्धृत करना आवश्यक है। सिद्धांत पहचानकर्ताओं को स्वचालित रूप से उद्धृत नहीं करता है, क्योंकि इससे हल होने से अधिक समस्याएं होती हैं। परिभाषा में टिकों का उपयोग करके स्पष्ट रूप से टेबल और कॉलम नामों को उद्धृत करने की आवश्यकता है।

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

सिद्धांत तब उपयोग किए गए डेटाबेस प्लेटफ़ॉर्म के अनुसार सभी SQL कथनों में इस कॉलम नाम को उद्धृत करेगा।

पहचानकर्ता उद्धरण स्तंभ नामों या भेदभावकर्ता कॉलम नामों में शामिल होने के लिए काम नहीं करता है जब तक आप एक कस्टम QuoteStrategy का उपयोग नहीं कर रहे हैं।

Doctrine\ORM\Mapping\QuoteStrategy इंटरफ़ेस को उद्धृत कॉलम पर अधिक नियंत्रण के लिए 2.3 में पेश किया गया था। यह प्रत्येक कॉलम, टेबल, उपनाम और अन्य एसक्यूएल नामों के लिए बुलाया जाता है। आप QuoteStrategy को कार्यान्वित कर सकते हैं और इसे Doctrine\ORM\Configuration#setQuoteStrategy() पर कॉल करके सेट कर सकते हैं।

एएनएसआई उद्धरण रणनीति जोड़ा गया था, जो किसी भी एसक्यूएल नाम के लिए उद्धरण आवश्यक नहीं है। आप नीचे दिए गए कोड के साथ इसका इस्तेमाल कर सकते हैं:

<?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 लागू करें।

उदाहरण के लिए, सिम्फोनी परियोजना के लिए:


कॉपी-पेस्ट विक्रेता 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 
} 

फिर, अपनी बोली रणनीति को सेवा के रूप में पंजीकृत करें:

एप्लिकेशन/config/config.yml

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

: 10

src/AppBundle/संसाधन/config/services.yml

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

फिर, अपने entitymanager विन्यास के लिए इसका इस्तेमाल करते हैं यह सब है :)