Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 条令与Postgres数组_Arrays_Postgresql_Doctrine - Fatal编程技术网

Arrays 条令与Postgres数组

Arrays 条令与Postgres数组,arrays,postgresql,doctrine,Arrays,Postgresql,Doctrine,我发现条令数组类型使用序列化/非序列化,并将数据存储在“简单”字段中,如text、integer 但我有一个项目,有一个postgres数据库,其中一些字段是数组(主要是文本)。我想把那个数据库和条令一起使用。有办法处理吗 谢谢 编辑: ps:多亏了Craig Ringer,我现在知道sql数组是一个很好的实践 也许我可以创建一个自定义类型。有人已经做过了吗 编辑2: 问题解决了一半: <?php namespace mysite\MyBundle\Types; use Doctrine

我发现条令数组类型使用序列化/非序列化,并将数据存储在“简单”字段中,如text、integer

但我有一个项目,有一个postgres数据库,其中一些字段是数组(主要是文本)。我想把那个数据库和条令一起使用。有办法处理吗

谢谢

编辑:

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
    }
}
和他们一起

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

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

在QueryBuilder中,您只需编写自定义函数即可使用它们:

$qb->where("ANY(a.b)");
一些进一步资料:

  • 您可以将自定义类型添加到Symfony应用程序的“条令”配置部分
  • 自定义DQL函数也是如此
  • 请参阅CLI上的“config:dump reference DoctrineBundle”命令,了解Symfony 2.1中的语法,否则请访问Symfony.com网站。

    SQL数组实际上是一种非常方便的非规范化方法,如果使用得当,可以极大地提高性能。它们只是在没有充分理由的情况下不应该被使用,它们的便携性较差等等。
    $arr[] = $qb->expr()->like($alias.".".$field, $qb->expr()->literal('%'.trim($val).'%') );
    
    if(count($arr) > 0) $qb->Where(new Expr\Orx($arr));
    else unset($arr);
    
    $qb->where("ANY(a.b)");