2013-03-27 26 views
22

Tôi tạo ra chức năng DQL tùy chỉnh của tôi cho Học thuyết DQL:Symfony 2/Doctrine thông số chức năng DQL do người dùng định nghĩa có giới hạn độ dài chuỗi?

class Translate extends FunctionNode { 
    public $field; 

    public function getSql(SqlWalker $sqlWalker) { 
     $query = "TRANSLATE(" . $this->field->dispatch($sqlWalker) . ", 'àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìíÌÍÎÏñÑôöðòóÒÓÔÕÖùúûüÙÚÛÜýÿÝ', 'AAAAAAAAAAAACCEEEEEEEEIIIIIIIINNOOOOOOOOOOUUUUUUUUYYY')"; 
     return $query; 
    } 

    public function parse(Parser $parser) { 
     $parser->match(Lexer::T_IDENTIFIER); 
     $parser->match(Lexer::T_OPEN_PARENTHESIS); 
     $this->field = $parser->StringPrimary(); 
     $parser->match(Lexer::T_CLOSE_PARENTHESIS); 
    } 
} 

Có vẻ như để làm việc tốt khi sử dụng nó.

Nhưng nếu tham số chuỗi chứa hơn 307 ký tự thì nó không hoạt động. Không có lỗi nhưng tập lệnh kết thúc.

$query = $this->createQueryBuilder('...'); 
$query->addSelect("TRANSLATE('less than 307 chars')"); // working 
$query->addSelect("TRANSLATE('more than 307 chars')"); // NOT working 

Tôi có thể sử dụng hơn 307 ký tự bằng cách nào?

+2

Bạn đã cố gắng chạy chỉ SQL với hơn 307 ký tự? Có thể đó là vấn đề trong kích thước truy vấn tối đa. –

+3

Có, và không có giới hạn. – Seb33300

+0

Và nếu tôi sửa đổi hàm DQL của tôi (lớp dịch) để trực tiếp đặt chuỗi của tôi, nó hoạt động: $ query = "TRANSLATE ('chuỗi thô với hơn 307 ký tự làm việc', 'àâäãáåÀÁÂÃÄÅçÇéèêëÉÈÊËîïìûÌÍÎÏñÑôöðòóÒÓÔÕÖùúûüÙÚÛÜýÿÝ', 'AAAAAAAAAAAACCEEEEEEEEIIIIIIIINNOOOOOOOOOOUUUUUUUUYYY')"; – Seb33300

Trả lời

2

Giống như wrikken đã giải thích, việc chuyển ngữ nên được thực hiện bằng cách sử dụng iconv vì điều đó sẽ tiết kiệm tài nguyên máy chủ của bạn.

đây là một chức năng đơn giản sẽ chuyển ngữ (chuyển đổi các ký tự không phải latin thành biểu diễn gần nhất của chúng trong bảng charset latin) thành chuỗi.

function transliterateString($str) 
{ 
    $serverLocale = setlocale(LC_CTYPE, 0); 
    setlocale(LC_CTYPE, 'en_US.UTF8'); 
    // transliterate the string using iconv 
    $str = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $str); 
    setlocale(LC_CTYPE, $serverLocale); // return the locale to what it was before 
    return $str; 
} 

Cách sử dụng:

$string = "café"; 
echo $string; 
echo transliterateString($string); 

trên sẽ ra dưới đây:

café 
cafe 
Các vấn đề liên quan