【问题标题】:How can I get a list of allowed values for a postgres constraint check from php如何从 php 获取 postgres 约束检查的允许值列表
【发布时间】:2018-04-13 07:39:24
【问题描述】:
CREATE TABLE public.tasks(
id integer NOT NULL DEFAULT nextval('tasks_id_seq'::regclass),
title character varying(255) NOT NULL,
status character varying(255) NOT NULL,
type character varying(255) NOT NULL,
CONSTRAINT tasks_pkey PRIMARY KEY (id),
CONSTRAINT tasks_status_check CHECK (status::text = ANY (ARRAY['Asignada'::character varying, 'Revision'::character varying, 'Cumplida'::character varying, 'Cancelada'::character varying, 'Diferida'::character varying, 'Retardada'::character varying]::text[])),
CONSTRAINT tasks_type_check CHECK (type::text = ANY (ARRAY['Academico-Docente'::character varying, 'Administrativas'::character varying, 'Creacion intelectual'::character varying, 'Integracion-Social'::character varying, 'Administrativo-Docente'::character varying, 'Produccion'::character varying]::text[])))
WITH ( OIDS=FALSE);
  ALTER TABLE public.tasks
  OWNER TO postgres;

鉴于此表,我如何获取约束 tasks_status_check 和 task_type_check 的可用白名单值?

另外,我试图从 Laravel 中做到这一点,Laravel 创建约束而不是枚举。我已经研究了一段时间,但找不到解决方案

我是在 MySql 中完成的,但我们正在迁移到 PostgreSql

我的代码是这样的

trait EnumHelper {
   public static function getEnumValues($field){
    $instance = new static;
    $type = DB::select(DB::raw('SHOW COLUMNS FROM '.$instance->getTable().' WHERE Field = "'.$field.'"'))[0]->Type;
    preg_match('/^enum\((.*)\)$/', $type, $matches);
    $values = array();
    foreach(explode(',', $matches[1]) as $value){
        $values[] = trim($value, "'");
    }
    return $values;
  }
}

提前致谢

【问题讨论】:

    标签: postgresql postgresql-9.4 laravel-5.5 php-7.1


    【解决方案1】:

    查询系统目录pg_constraintconsrc 列以获取检查约束的文本表示。

    如果您正在寻找文本字面量(例如本例),您可以使用正则表达式和函数regexp_matches(),例如:

    select conname, array_agg(matches[1]) as "white list"
    from pg_constraint,
    regexp_matches(consrc, '''(.+?)''', 'g') matches
    where contype = 'c'
    and conrelid = 'public.tasks'::regclass
    group by 1;
    
          conname       |                                                   white list                                                    
    --------------------+-----------------------------------------------------------------------------------------------------------------
     tasks_type_check   | {Academico-Docente,Administrativas,"Creacion intelectual",Integracion-Social,Administrativo-Docente,Produccion}
     tasks_status_check | {Asignada,Revision,Cumplida,Cancelada,Diferida,Retardada}
    (2 rows)
    

    【讨论】:

      【解决方案2】:

      感谢克林,我成功了!他的回答很有用

      trait EnumHelper {
        public static function getEnumValues($field){
          $instance = new static;
          $types = DB::select("
              select matches[1]
              from pg_constraint,
              regexp_matches(consrc, '''(.+?)''', 'g') matches
              where contype = 'c'
              and conname = '".$instance->getTable()."_".$field."_check'
              and conrelid = 'public.tasks'::regclass;
          ");
          $values = array();
          foreach($types as $type){
              $values[] = $type->matches;
          }
          return $values;
        }
      }
      

      现在完美运行。

      【讨论】:

        猜你喜欢
        • 2023-01-06
        • 1970-01-01
        • 2016-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-13
        • 2022-11-19
        • 2020-10-24
        相关资源
        最近更新 更多