$ lexprog.com

// notes from an old coder -- php, databases, and the occasional rant

[April 09, 2026] PostgreSQL

PostgreSQL Extensions for Laravel

PostgreSQL Extensions: Tips & Tricks

────────────────────────────────────────────────────────

PostgreSQL Extensions: Tips & Tricks

Tip: UUID Extension

DB::statement('CREATE EXTENSION IF NOT EXISTS "uuid-ossp"');
$table->uuid('id')->primary();

Better than auto-increment for distributed systems.

Gotcha: uuid-ossp vs pgcrypto

Modern PostgreSQL (13+) has gen_random_uuid() built in. No extension needed:

DB::statement("ALTER TABLE posts ALTER COLUMN id SET DEFAULT gen_random_uuid()");

Tip: pg_trgm for Fuzzy Search

DB::statement('CREATE EXTENSION IF NOT EXISTS pg_trgm');
DB::statement("CREATE INDEX idx_posts_title ON posts USING gin (title gin_trgm_ops)");

Enables LIKE '%term%' queries with index support.

Gotcha: citext for Case-Insensitive Text

DB::statement('CREATE EXTENSION IF NOT EXISTS citext');
$table->citext('email')->unique();

No need for LOWER() in queries.

Tip: PostGIS for Geospatial

DB::statement('CREATE EXTENSION IF NOT EXISTS postgis');

Industry-standard geospatial support. Store and query geographic data.

Gotcha: Extension Versioning

Extensions can be updated:

ALTER EXTENSION pg_trgm UPDATE;

Check available versions with pg_available_extension_versions.

Tip: btree_gin for Mixed Indexes

DB::statement('CREATE EXTENSION IF NOT EXISTS btree_gin');

Allows GIN indexes on regular columns (not just arrays/JSONB).

Gotcha: Extensions Are Per-Database

CREATE EXTENSION pg_trgm;

Must be installed in each database separately, not cluster-wide.

Tip: EXPLAIN (ANALYZE, BUFFERS) Is Your Best Friend

For query debugging, always use EXPLAIN (ANALYZE, BUFFERS) instead of plain EXPLAIN. The BUFFERS option shows hit/miss rates for every node, revealing whether your indexes are actually in memory.

Tip: Partial Indexes Are Underutilized

CREATE INDEX ON orders (status) WHERE status = 'pending' creates a tiny index that covers only the rows your query needs. It's faster to scan and cheaper to maintain than a full-column index.

Gotcha: NULL Sorting Is Non-Obvious

By default, NULLs sort AFTER non-null values in ascending order. ORDER BY col DESC puts NULLs FIRST. Use NULLS LAST or NULLS FIRST to be explicit.

Senior Insight

PostgreSQL extensions are a superpower, but they create deployment dependencies. I've seen CI pipelines fail because uuid-ossp wasn't available on the test database server. Always list required extensions in your migration files with CREATE EXTENSION IF NOT EXISTS, and verify extension availability in your deployment checklist. The extensions I use most: pg_trgm for fuzzy text search, btree_gin for composite indexes, and postgis for geospatial data.

Source: pganalyze Blog (https://pganalyze.com/blog), PostgreSQL Docs (https://www.postgresql.org/docs/current/), Crunchy Data Blog (https://www.crunchydata.com/blog)

────────────────────────────────────────────────────────
<-- back to posts