[DOC_LINK:/documentation/components/libs/postgresql.md]
[TOC]
The Domain Query Builder provides a fluent, type-safe interface for constructing PostgreSQL domain management statements: CREATE DOMAIN, ALTER DOMAIN, and DROP DOMAIN.
Domains are user-defined data types with optional constraints. They are useful for defining reusable data types with specific validation rules.
<?php
use function Flow\PostgreSql\DSL\create;
$query = create()->domain('email')
->as('text');
echo $query->toSql();
// CREATE DOMAIN email AS text<?php
use function Flow\PostgreSql\DSL\create;
$query = create()->domain('public.email')
->as('text');
echo $query->toSql();
// CREATE DOMAIN public.email AS text<?php
use function Flow\PostgreSql\DSL\create;
$query = create()->domain('email')
->as('text')
->notNull();
echo $query->toSql();
// CREATE DOMAIN email AS text NOT NULLExplicitly allow NULL values:
<?php
use function Flow\PostgreSql\DSL\create;
$query = create()->domain('email')
->as('text')
->null();
echo $query->toSql();
// CREATE DOMAIN email AS text NULLSet a default value:
<?php
use function Flow\PostgreSql\DSL\create;
$query = create()->domain('email')
->as('text')
->default("'default@example.com'");
echo $query->toSql();
// CREATE DOMAIN email AS text DEFAULT 'default@example.com'Add a CHECK constraint:
<?php
use function Flow\PostgreSql\DSL\create;
$query = create()->domain('positive_int')
->as('int4')
->check('VALUE > 0');
echo $query->toSql();
// CREATE DOMAIN positive_int AS int4 CHECK (value > 0)Add a named CHECK constraint:
<?php
use function Flow\PostgreSql\DSL\create;
$query = create()->domain('positive_int')
->as('int4')
->constraint('positive_check')
->check('VALUE > 0');
echo $query->toSql();
// CREATE DOMAIN positive_int AS int4 CONSTRAINT positive_check CHECK (value > 0)Specify a collation:
<?php
use function Flow\PostgreSql\DSL\create;
$query = create()->domain('email')
->as('text')
->collate('en_US');
echo $query->toSql();
// CREATE DOMAIN email AS text COLLATE "en_US"<?php
use function Flow\PostgreSql\DSL\create;
$query = create()->domain('email')
->as('text')
->notNull()
->check("VALUE ~ '^.+@.+$'");
echo $query->toSql();
// CREATE DOMAIN email AS text NOT NULL CHECK (value ~ '^.+@.+$')<?php
use function Flow\PostgreSql\DSL\alter;
$query = alter()->domain('email')
->setNotNull();
echo $query->toSql();
// ALTER DOMAIN email SET NOT NULL<?php
use function Flow\PostgreSql\DSL\alter;
$query = alter()->domain('email')
->dropNotNull();
echo $query->toSql();
// ALTER DOMAIN email DROP NOT NULL<?php
use function Flow\PostgreSql\DSL\alter;
$query = alter()->domain('email')
->setDefault("'default@example.com'");
echo $query->toSql();
// ALTER DOMAIN email SET DEFAULT 'default@example.com'<?php
use function Flow\PostgreSql\DSL\alter;
$query = alter()->domain('email')
->dropDefault();
echo $query->toSql();
// ALTER DOMAIN email DROP DEFAULT<?php
use function Flow\PostgreSql\DSL\alter;
$query = alter()->domain('email')
->addConstraint('valid_email', "VALUE ~ '^.+@.+$'");
echo $query->toSql();
// ALTER DOMAIN email ADD CONSTRAINT valid_email CHECK (value ~ '^.+@.+$')<?php
use function Flow\PostgreSql\DSL\alter;
$query = alter()->domain('email')
->dropConstraint('valid_email');
echo $query->toSql();
// ALTER DOMAIN email DROP CONSTRAINT valid_email<?php
use function Flow\PostgreSql\DSL\alter;
$query = alter()->domain('email')
->dropConstraint('valid_email')
->cascade();
echo $query->toSql();
// ALTER DOMAIN email DROP CONSTRAINT valid_email CASCADEValidate an existing constraint:
<?php
use function Flow\PostgreSql\DSL\alter;
$query = alter()->domain('email')
->validateConstraint('valid_email');
echo $query->toSql();
// ALTER DOMAIN email VALIDATE CONSTRAINT valid_email<?php
use function Flow\PostgreSql\DSL\alter;
$query = alter()->domain('public.email')
->setNotNull();
echo $query->toSql();
// ALTER DOMAIN public.email SET NOT NULL<?php
use function Flow\PostgreSql\DSL\drop;
$query = drop()->domain('email');
echo $query->toSql();
// DROP DOMAIN email<?php
use function Flow\PostgreSql\DSL\drop;
$query = drop()->domain('email')
->ifExists();
echo $query->toSql();
// DROP DOMAIN IF EXISTS emailDrop all objects that depend on the domain:
<?php
use function Flow\PostgreSql\DSL\drop;
$query = drop()->domain('email')
->cascade();
echo $query->toSql();
// DROP DOMAIN email CASCADERefuse to drop the domain if any objects depend on it (default behavior):
<?php
use function Flow\PostgreSql\DSL\drop;
$query = drop()->domain('email')
->restrict();
echo $query->toSql();
// DROP DOMAIN email<?php
use function Flow\PostgreSql\DSL\drop;
$query = drop()->domain('email', 'phone', 'url');
echo $query->toSql();
// DROP DOMAIN email, phone, url<?php
use function Flow\PostgreSql\DSL\drop;
$query = drop()->domain('email')
->ifExists()
->cascade();
echo $query->toSql();
// DROP DOMAIN IF EXISTS email CASCADEFor a complete list of DSL functions, see the DSL reference.