2012-05-06 4 views
34

Có cách nào để tự động trích dẫn các từ dành riêng với Doctrine 2 khi sử dụng $entityManager->find('entity', id) không?Trích dẫn tự động trích dẫn từ với Doctrine 2

Khi sử dụng trình tạo truy vấn, điều này có thể được thực hiện nhưng sẽ có cài đặt cấu hình chung thực hiện điều này? Tôi không muốn phải chỉ định nó trong các chú thích cho các từ dành riêng.

Trả lời

57

Đây là vấn đề tôi đã nêu ra trong khi trở lại với nhóm Giáo lý.

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

Vé đã được khép lại với những nhận xét:

Bạn phải tự thoát khỏi nhân vật với @column (name = "` integer`")

Vì vậy, tôi đoán bạn cần phải xử lý bất kỳ từ khóa nào được bảo lưu trong các chú thích của mình

+0

Tôi vừa phát hiện ra rằng giáo lý DBAL hiện được vận chuyển bằng công cụ cli \ Doctrine \ DBAL \ Tools \ Console \ Comma nd \ ReservedWordsCommand() thực sự hữu ích cho việc quét các thực thể của bạn cho bất kỳ thứ gì có thể gây ra vấn đề. Hãy thử chạy "doctrine dbal: reserved-words" để kiểm tra nó. –

+5

+1 Có vẻ kỳ lạ khi tạo bảng hoạt động tốt. –

+6

Học thuyết IMHO bị hỏng ở đây. Bất cứ nơi nào khác mà hệ thống không thoát khỏi mọi thứ cho bạn, nó sẽ được gọi là lỗ hổng SQL injection. – rjmunro

3

4.6. Trích dẫn các từ được dành riêng

Đôi khi cần báo giá cột hoặc tên bảng vì xung đột từ dành riêng. Học thuyết không tự động trích dẫn số nhận dạng vì nó dẫn đến nhiều vấn đề hơn là giải quyết. Quoting bảng và tên cột cần phải được thực hiện một cách rõ ràng bằng cách sử dụng bọ ve trong định nghĩa.

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

Sau đó, giáo lý sẽ trích dẫn tên cột này trong tất cả các câu lệnh SQL theo nền tảng cơ sở dữ liệu đã sử dụng.

Định danh Trích dẫn không hoạt động đối với tên cột tham gia hoặc tên cột phân biệt đối xử trừ khi bạn đang sử dụng CustomStrategy tùy chỉnh.

Để có nhiều quyền kiểm soát hơn đối với cột, giao diện Doctrine\ORM\Mapping\QuoteStrategy được giới thiệu trong 2.3. Nó được gọi cho mọi cột, bảng, bí danh và các tên SQL khác. Bạn có thể thực hiện QuoteStrategy và thiết lập nó bằng cách gọi Doctrine\ORM\Configuration#setQuoteStrategy().

Chiến lược Trích dẫn ANSI đã được thêm vào, giả định rằng việc trích dẫn không cần thiết cho bất kỳ tên SQL nào. Bạn có thể sử dụng nó với đoạn mã sau:

<?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

Nó không được thực hiện bởi Học thuyết chỉ vì nó quá nền tảng tùy.

Tất cả những gì bạn cần, là triển khai QuoteStrategy của riêng mình.

Ví dụ, đối project symfony:


Sao chép-dán nhà cung cấp AnsiQuoteStrategy lớp, đổi tên nó và làm cho một số trích dẫn:

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 
} 

Sau đó, đăng ký chiến lược báo giá của bạn dưới dạng dịch vụ:

src/AppBundle/Resources/config/services.yml

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

Sau đó, sử dụng nó để cấu hình EntityManager của bạn:
app/config/config.yml

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

Đó là tất cả :)