2012-08-14 35 views
5

Tôi đã tìm thấy rằng các loại mảng Doctrine đang sử dụng serialize/unserialize và lưu trữ dữ liệu bên trong các trường "đơn giản" như văn bản, số nguyên.Các mảng Doctrine và Postgres

Nhưng tôi có một dự án với cơ sở dữ liệu postgres với một số trường dưới dạng mảng (chủ yếu là văn bản). Tôi muốn sử dụng cơ sở dữ liệu đó với Doctrine. Có cách nào để xử lý điều đó không?

Cảm ơn

EDIT:

ps: bây giờ tôi biết rằng mảng sql có thể là một thực hành tốt, nhờ Craig Ringer.

Có lẽ tôi có thể tạo loại tùy chỉnh. Có ai đó đã làm điều đó không?

EDIT 2:

Vấn đề nửa giải quyết:

<?php 
namespace mysite\MyBundle\Types; 

use Doctrine\DBAL\Types\Type; 
use Doctrine\DBAL\Platforms\AbstractPlatform; 

/** 
    * My custom postgres text array datatype. 
*/ 
class TEXTARRAY extends Type 
{ 
    const TEXTARRAY = 'textarray'; // modify to match your type name 

    public function getSqlDeclaration(array $fieldDeclaration, AbstractPlatform $platform) 
    { 
     return $platform->getDoctrineTypeMapping('TEXTARRAY'); 
    } 

    public function convertToPHPValue($value, AbstractPlatform $platform) 
    { 
    // This is executed when the value is read from the database. Make your conversions here, optionally using the $platform. 
     return explode('","', trim($value, '{""}')); 
    } 

    public function convertToDatabaseValue($value, AbstractPlatform $platform) 
    { 
    // This is executed when the value is written to the database. Make your conversions here, optionally using the $platform. 

     settype($value, 'array'); // can be called with a scalar or array 
     $result = array(); 
     foreach ($set as $t) { 
      if (is_array($t)) { 
       $result[] = to_pg_array($t); 
      } else { 
       $t = str_replace('"', '\\"', $t); // escape double quote 
       if (! is_numeric($t)) // quote only non-numeric values 
        $t = '"' . $t . '"'; 
       $result[] = $t; 
      } 
     } 
     return '{' . implode(",", $result) . '}'; // format  

    } 

    public function getName() 
    { 
     return self::TEXTARRAY; // modify to match your constant name 
    } 
} 

và bộ điều khiển

<?php 

namespace mysite\MyBundle; 

use Symfony\Component\HttpKernel\Bundle\Bundle; 
use Doctrine\ORM\EntityManager; 
use Doctrine\DBAL\Types\Type; 

class mysiteMyBundle extends Bundle 
{ 
    public function boot() { 
     Type::addType('textarray', 'mysite\MyBundle\Types\TextArray'); 
     $em = $this->container->get('doctrine.orm.default_entity_manager'); 
     $conn = $em->getConnection(); 
     $conn->getDatabasePlatform()->registerDoctrineTypeMapping('TEXTARRAY', 'textarray'); 
    } 
} 

Tôi biết muốn tìm kiếm bên trong các mảng với các truy vấn như 'myword' = BẤT CỨ (myarrayfield) ... Có ai đó có manh mối không?

Ai đó trên kênh # doctrine2 nói với tôi để xây dựng một chức năng tùy chỉnh DQL, vì vậy ở đây là:

<?php 
use Doctrine\ORM\Query\Lexer; 
use Doctrine\ORM\Query\AST\Functions\FunctionNode; 

class ANY extends FunctionNode { 

    public $field; 


    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker) { 
     return 'ANY(' . 
      $this->field->dispatch($sqlWalker) . ')'; 
    } 

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

NHƯNG, tôi xây dựng các truy vấn của tôi với một người thợ xây truy vấn, với mảng chứa những thứ như

$arr[] = $qb->expr()->like($alias.".".$field, $qb->expr()->literal('%'.trim($val).'%')); 

Và gia nhập chúng với

if(count($arr) > 0) $qb->Where(new Expr\Orx($arr)); 
else unset($arr); 

Vì vậy, làm thế nào để sử dụng chức năng của tôi? : \

+2

Mảng SQL thực sự là một sự biến đổi thuận tiện * thực sự * có thể là một hiệu suất rất lớn khi được sử dụng một cách khôn ngoan và cẩn thận. Chúng không nên được sử dụng mà không có lý do chính đáng, ít di động hơn, v.v. –

Trả lời

4

Bên trong QueryBuilder bạn có thể sử dụng chức năng tùy chỉnh của bạn chỉ bằng cách viết chúng:

$qb->where("ANY(a.b)"); 

Một số thông tin thêm:

  1. Bạn có thể thêm các loại tùy chỉnh để "học thuyết" phần config trong ứng dụng Symfony của bạn.
  2. Các lưu giữ tương tự cho hàm DQL tùy chỉnh.

Xem lệnh "config: dump-reference DoctrineBundle" trên CLI cho cú pháp trong Symfony 2.1, nếu không trên trang web symfony.com.

Các vấn đề liên quan