flow php

Insert Query Builder

The Insert Query Builder provides a fluent, type-safe interface for constructing PostgreSQL INSERT queries. It supports simple inserts, multi-row inserts, INSERT ... SELECT, upserts (ON CONFLICT), and RETURNING clauses.

Simple Insert

<?php

use function Flow\PostgreSql\DSL\{insert, literal};

$query = insert()
    ->into('users')
    ->columns('name', 'email')
    ->values(literal('John'), literal('[email protected]'));

echo $query->toSQL();
// INSERT INTO users (name, email) VALUES ('John', '[email protected]')

Insert with Parameters

Use positional parameters for prepared statements:

<?php

use function Flow\PostgreSql\DSL\{insert, param};

$query = insert()
    ->into('users')
    ->columns('name', 'email')
    ->values(param(1), param(2));

echo $query->toSQL();
// INSERT INTO users (name, email) VALUES ($1, $2)

Multi-Row Insert

<?php

use function Flow\PostgreSql\DSL\{insert, literal};

$query = insert()
    ->into('users')
    ->columns('name', 'email')
    ->values(literal('John'), literal('[email protected]'))
    ->values(literal('Jane'), literal('[email protected]'));

echo $query->toSQL();
// INSERT INTO users (name, email) VALUES ('John', '[email protected]'), ('Jane', '[email protected]')

Insert with Default Values

<?php

use function Flow\PostgreSql\DSL\insert;

$query = insert()
    ->into('users')
    ->defaultValues();

echo $query->toSQL();
// INSERT INTO users DEFAULT VALUES

INSERT ... SELECT

<?php

use function Flow\PostgreSql\DSL\{insert, select, table, col};

$selectQuery = select()
    ->select(col('name'), col('email'))
    ->from(table('archived_users'));

$query = insert()
    ->into('users')
    ->columns('name', 'email')
    ->select($selectQuery);

echo $query->toSQL();
// INSERT INTO users (name, email) SELECT name, email FROM archived_users

Upsert (ON CONFLICT)

ON CONFLICT DO NOTHING

<?php

use function Flow\PostgreSql\DSL\{insert, literal};

// Without specifying conflict target
$query = insert()
    ->into('users')
    ->columns('name', 'email')
    ->values(literal('John'), literal('[email protected]'))
    ->onConflictDoNothing();

echo $query->toSQL();
// INSERT INTO users (name, email) VALUES ('John', '[email protected]') ON CONFLICT DO NOTHING

ON CONFLICT (columns) DO NOTHING

<?php

use function Flow\PostgreSql\DSL\{insert, literal, conflict_columns};

$query = insert()
    ->into('users')
    ->columns('name', 'email')
    ->values(literal('John'), literal('[email protected]'))
    ->onConflictDoNothing(conflict_columns(['email']));

echo $query->toSQL();
// INSERT INTO users (name, email) VALUES ('John', '[email protected]') ON CONFLICT (email) DO NOTHING

ON CONFLICT ON CONSTRAINT DO NOTHING

<?php

use function Flow\PostgreSql\DSL\{insert, literal, conflict_constraint};

$query = insert()
    ->into('users')
    ->columns('name', 'email')
    ->values(literal('John'), literal('[email protected]'))
    ->onConflictDoNothing(conflict_constraint('users_pkey'));

echo $query->toSQL();
// INSERT INTO users (name, email) VALUES ('John', '[email protected]') ON CONFLICT ON CONSTRAINT users_pkey DO NOTHING

ON CONFLICT DO UPDATE

<?php

use function Flow\PostgreSql\DSL\{insert, literal, conflict_columns};

$query = insert()
    ->into('users')
    ->columns('email', 'name')
    ->values(literal('[email protected]'), literal('John'))
    ->onConflictDoUpdate(
        conflict_columns(['email']),
        ['name' => literal('Updated John')]
    );

echo $query->toSQL();
// INSERT INTO users (email, name) VALUES ('[email protected]', 'John') ON CONFLICT (email) DO UPDATE SET name = 'Updated John'

ON CONFLICT DO UPDATE with EXCLUDED

Reference the values that would have been inserted using the excluded pseudo-table:

<?php

use function Flow\PostgreSql\DSL\{insert, param, conflict_columns, col};

$query = insert()
    ->into('users')
    ->columns('email', 'name')
    ->values(param(1), param(2))
    ->onConflictDoUpdate(
        conflict_columns(['email']),
        ['name' => col('excluded.name')]
    );

echo $query->toSQL();
// INSERT INTO users (email, name) VALUES ($1, $2) ON CONFLICT (email) DO UPDATE SET name = excluded.name

ON CONFLICT DO UPDATE with WHERE

<?php

use function Flow\PostgreSql\DSL\{
    insert, literal, conflict_columns, eq, col
};

$query = insert()
    ->into('users')
    ->columns('email', 'name', 'active')
    ->values(literal('[email protected]'), literal('John'), literal(true))
    ->onConflictDoUpdate(
        conflict_columns(['email']),
        ['name' => literal('Updated John')]
    )
    ->where(eq(col('users.active'), literal(true)));

echo $query->toSQL();
// INSERT INTO users (email, name, active) VALUES ('[email protected]', 'John', true) ON CONFLICT (email) DO UPDATE SET name = 'Updated John' WHERE users.active = true

RETURNING Clause

<?php

use function Flow\PostgreSql\DSL\{insert, literal, col};

// Return specific columns
$query = insert()
    ->into('users')
    ->columns('name')
    ->values(literal('John'))
    ->returning(col('id'));

echo $query->toSQL();
// INSERT INTO users (name) VALUES ('John') RETURNING id

// Return all columns
$query = insert()
    ->into('users')
    ->columns('name')
    ->values(literal('John'))
    ->returningAll();

echo $query->toSQL();
// INSERT INTO users (name) VALUES ('John') RETURNING *

Schema-Qualified Tables

<?php

use function Flow\PostgreSql\DSL\{insert, literal};

$query = insert()
    ->into('public.users')
    ->columns('name')
    ->values(literal('John'));

echo $query->toSQL();
// INSERT INTO public.users (name) VALUES ('John')

For a complete list of DSL functions, see the DSL reference.


Contributors

Join us on GitHub external resource
scroll back to top