2017-11-01 10 views
1
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; 

dieser Tabelle, wie kann ich die verfügbaren weiß aufgeführten Werte für die Zwänge tasks_status_check und task_type_check bekommen?Wie kann ich eine Liste der erlaubten Werte für eine Postgres Bedingungsprüfung von PHP erhalten

Zusätzlich, ich versuche es von Laravel zu tun, Laravel schafft Einschränkungen statt Enums. Ich habe eine Zeit lang untersucht, konnte aber keine Lösung

Ich habe es in MySql, aber wir bewegen zu PostgreSql

mein Code war so etwas wie dieser

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

Vielen Dank im Voraus

Antwort

1

Fragen Sie die Spalte consrc des Systemkatalogs pg_constraint ab, um die textuelle Darstellung einer Prüfbedingung zu erhalten.

Wenn Sie Textliterale suchen (wie in diesem Fall) Sie einen regulären Ausdruck und die Funktion regexp_matches(), Beispiel verwenden können:

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) 
0

Ich habe es dank Klin! Seine Antwort war sehr nützlich.

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

Funktioniert jetzt perfekt.

Verwandte Themen