arrays - Doctrine 和 Postgres 数组

标签 arrays postgresql doctrine

我发现 Doctrine 数组类型使用序列化/反序列化并将数据存储在“简单”字段(如文本、整数)中。

但我有一个带有 postgres 数据库的项目,其中一些字段作为数组(主要是文本)。我想将该数据库与 Doctrine 一起使用。有办法处理吗?

谢谢

编辑:

ps:感谢 Craig Ringer,我现在知道 sql 数组是一种很好的做法。

也许我可以创建自定义类型。有人已经做到了吗?

编辑 2:

问题解决了一半:

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

和 Controller

<?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');
    }
}

我知道想在这些数组中搜索像 'myword' = ANY(myarrayfield) 这样的查询...有人有线索吗?

#doctrine2 channel 上有人告诉我要构建自定义 DQL 函数,所以这里是:

<?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);
    }
}

但是,我使用查询生成器构建我的查询,数组包含类似

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

加入他们

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

那么,如何使用我的函数呢? :\

最佳答案

在 QueryBuilder 中,您可以通过编写自定义函数来使用它们:

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

一些进一步的信息:

  1. 您可以将自定义类型添加到 Symfony 应用程序的“doctrine”配置部分。
  2. 自定义 DQL 函数也是如此。

有关 Symfony 2.1 中的语法,请参阅 CLI 上的“config:dump-reference DoctrineBundle”命令,否则请参阅 symfony.com 网站。

关于arrays - Doctrine 和 Postgres 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11951303/

相关文章:

ruby-on-rails - Rails has_many 带有一个整数主键和一个字符串外键

python - 如何通过csv文件将特定列复制到postgresql

php - Doctrine 从实体生成中排除表

java - 计算整数的位数

c++ - 在 C++ 中创建一个以 6 为基数的大型数组?

java - 恢复多对多关系元素时出现问题

codeigniter - Doctrine 2 和 CodeIgniter 入门

symfony - Symfony2 命名空间的文档

c - 在c中将2D int数组从一个函数传递到另一个函数

java - 无法将 getBytes() 分配给字节数组