PHP Luminova: Object-Relational Mapping (ORM) and Query Builder
Database Builder Class: An Object-Relational Mapping Tool for Simplified CRUD Operations and Object-Oriented Database Management.
The Luminova database query Builder class is an ORM (Object-Relational Mapping) tool that simplifies working with databases. It provides object-oriented methods that construct SQL queries and binding. Features include support for table Join, UNION queries, promise-style resolution, and more.
With flexible CRUD (Create, Read, Update, Delete) capabilities, you can build both simple and advanced SQL queries with ease. This reduces the need to write raw SQL, letting you focus on your application logic instead of query syntax. Each method in the Builder class closely mirrors SQL conventions, so if you're familiar with SQL, you'll feel right at home.
For detailed examples and usage patterns, see the Query Builder Usage Examples.
Usage Examples
Note: This class uses a private constructor to prevent direct instantiation. You cannot call
new Builder()directly.
To create a Builder instance, use one of the following static methods:
Builder::getInstance(...)Builder::table(...)Builder::query(...)Builder::exec(...)(for custom SQL)
Shared Initialization
Use getInstance() to create a base Builder instance that shares configuration across multiple table calls:
$builder = Builder::getInstance()
->strict(true) // Enforce strict WHERE checks on DELETE and UPDATE
->cacheable(true) // Enable query caching for all table
->closeAfter(true) // Automatically close DB connection after execution
->returns(Builder::RETURN_ARRAY); // Set return format to arrayNow you can chain operations with inherited settings:
$result = $builder->table('users')
->select(['name'])
->where('id', '=', 100);Single Initializers
Initialize a Builder instance with a specific table name:
$table = Builder::table('table-name', 'optional-alias');Run a raw SQL query with optional bindings:
$result = Builder::query('SELECT * FROM users')->execute([...]);Execute a raw SQL command and get the number of affected rows:
$result = Builder::exec('ALTER TABLE users AUTO_INCREMENT = 2');Raw Expressions
The RawExpression class provide access to pass raw sql query to builder either to column, values or SQL query body. Use raw expressions when you need to insert or evaluate direct SQL values in methods like select, insert, or update.
Inline Expression
$expr = Builder::raw('COUNT(*) AS total');Expression Class
use Luminova\Database\RawExpression;
// Create a new expression instance
$raw = new RawExpression('NOW()');
// Predefined helpers
RawExpression::increment('column'); // column = column + 1
RawExpression::decrement('column', 2); // column = column - 2
RawExpression::now(); // NOW()
// And moreBuilder Execution Order
The Builder class processes methods in a defined order. This ensures clarity and consistency when building queries:
- Table Definition –
table(...) - Selector Method –
select,find,sum,average,total,copy, etc. - Conditions and Filters –
where,join,in,like,limit, etc. - Execution Method –
get,fetch,promise,stmt,to,has, etc.
Example Structure:
$result = Builder::table('users') // Step 1: Define table
->select(['name', 'email']) // Step 2: Select fields or use aggregate
->where('id', '=', 1) // Step 3: Add conditions
->limit(1) // Additional filters (limit, order, etc.)
->cache(true) // Optional settings
->get(); // Step 4: Execute and fetchNote: The order of selector, condition, filter, or option methods doesn't affect the query. The only requirement is that a query executor method such as
get,fetch,update,insert,delete,promise,stmt,to, orhasmust be called last to trigger execution.
Union Tables
To build a union of multiple queries, do not call execution methods like get(), fetch(), promise(), or stmt() on any part of the chain until the entire union structure is defined. Calling them prematurely will execute the current query instead of merging it with others.
Use union() or unionAll() to combine multiple queries. Each union source can be either:
- a
Builderinstance - a
Closurereturning aBuilderinstance ornull(to skip that union source)
After combining all queries, you can apply filters, limits, or sorting to the union result before calling the final executor.
Basic Union (using closure)
$result = Builder::table('users')
->select(['name', 'email'])
->where('id', '=', 1)
->union(function () {
return Builder::table('contacts')
->select(['name', 'email'])
->where('id', '=', 1);
})
->get();Union with Predefined Instances
$privates = Builder::table('users')->where('visibility', '=', 'private');
$publics = Builder::table('users')->where('visibility', '=', 'public');
$invisible = Builder::table('users')->where('visibility', '=', 'invisible');
$results = $privates
->union($publics)
->union($invisible)
->columns(['id', 'email'])
->descending('id')
->get();Advanced Union with Chained Closures
$result = Builder::table('users')
->select(['user_id AS id', 'user_email AS email'])
->where('user_visibility', '=', 'private')
->limit(3)
->union(function () {
return Builder::table('users')
->select(['user_id AS id', 'user_email AS email'])
->where('user_visibility', '=', 'public')
->limit(3);
})
->union(function () {
return Builder::table('users')
->select(['user_id AS id', 'user_username AS email'])
->where('user_visibility', '=', 'invisible')
->limit(3);
})
->columns(['id', 'email']) // Optional: override final column structure
->descending('id')
->limit(9)
->returns(Builder::RETURN_ARRAY)
->get();Note: You can still apply additional
where,limit,order,cache, andconjoin()filters to the final union result before execution.
Class Definition
- Class namespace:
Luminova\Database\Builder - This class implements: \Luminova\Exceptions\LazyInterface,
Constants
Full-Text Match Modes
The constant are predefine modes for fulltext search when using match, against or orderAgainst.
| Constant | SQL Equivalent | Description |
|---|---|---|
MATCH_NATURAL | IN NATURAL LANGUAGE MODE | Default mode; interprets the search string as natural human language. |
MATCH_BOOLEAN | IN BOOLEAN MODE | Supports boolean operators like +, -, >, *, etc., for fine control. |
MATCH_NATURAL_EXPANDED | IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION | Uses natural language search with automatic query expansion. |
MATCH_EXPANSION | WITH QUERY EXPANSION | Performs search with query expansion only, no base mode specified. |
Methods
database
Get database connection driver instance (e.g, MySqlDriver or PdoDriver).
public static database(): Luminova\Instance\DatabaseInterfaceReturn Value:
Luminova\Interface\DatabaseInterface|null - Return database driver instance.
Throws:
- \Luminova\Exceptions\DatabaseException - Throws if database connection failed.
Returning the Original Database Connection Object
This method retrieves the underlying database connection instance, which can be either PDO or MySqli, encapsulated within the Luminova\Interface\ConnInterface.
$conn = Builder::database()->raw();This is useful when you need to access the raw connection for operations not covered by the interface.
getInstance
Get or initialize the shared singleton instance of the Builder class.
This method also allows setting global configurations for query execution, ensuring consistency across multiple queries.
public static getInstance(?string $table = null, ?string $alias = null): Luminova\Database\BuilderParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The table name to query (non-empty string). |
$alias | string|null | Optional table alias (default: NULL). |
Return Value:
Luminova\Database\Builder - Returns the singleton instance of the Builder class.
Throws:
- \Luminova\Exceptions\DatabaseException - If the database connection fails.
getCache
Retrieves the current cache instance.
This method returns the static cache instance used by builder table method. The cache instance is typically set up earlier in the builders class's lifecycle.
public static getCache(): ?Luminova\Base\BaseCacheReturn Value:
Luminova\Base\BaseCache|null - Returns the current cache instance if set, or null if no cache has been initialized.
getDebug
Get an array of debug query information.
Returns detailed debug information about the query, including formats for MySQL and PDO placeholders, as well as the exact binding mappings for each column.
public getDebug(): array<string,mixed>Return Value:
array<string,mixed> - Return array containing query information.
table
Creates an instance of the builder class and sets the target database table.
This method is essential in the Builder class and is typically called first to define the table you want to work with.
public static table(string $table, ?string $alias = null): Luminova\Database\BuilderParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The name of the database table (must be a non-empty string). |
$alias | string|null | Optional alias for the table (default: null). |
Return Value:
Luminova\Database\Builder - Returns the instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if an invalid table name is provided.
Example:
Performing a table join and executing queries:
$tbl = Builder::table('users', 'u')
->innerJoin('roles', 'r')
->on('u.id', '=', 'r.role_uid')
->where('u.id', '=', 1);
// Updating records
$result = $tbl->update(['r.role_id' => 1]);
// Selecting records
$result = $tbl->select(['r.role_id', 'u.name', 'u.user_foo AS foo'])->get();query
Executes an SQL query with an optional placeholders.
This method allows direct execution of raw SQL queries with supports for caching result. If an array of values is passed to the execute method, prepared statements are used for security. Otherwise, ensure that manually embedded values in the query are properly escaped.
public static query(string $query): Luminova\Database\BuilderParameters:
| Parameter | Type | Description |
|---|---|---|
$query | string | The SQL query string (must be non-empty). |
Return Value:
Luminova\Database\Builder - Return instance of builder class.
Throws:
- \Luminova\Exceptions\DatabaseException - Throws if the query is empty string or an error occur.
Examples:
Executing a raw query:
$updated = Builder::query("
UPDATE addresses
SET default_address = (address_id = :address_id)
WHERE address_uid = :user_id
")->execute([
'address_id' => 1,
'user_id' => 101
], RETURN_COUNT);Selecting records and cache results:
$result = Builder::query("SELECT * FROM users WHERE id = :user_id")
->cache('cache-key')
->execute(['user_id' => 101]);exec
Execute an SQL query string directly without bind nor prepared statement and return the number of affected rows.
For DDL statements like CREATE, ALTER, DROP etc..., the return value is typically of executed 1 rather than 0, even though these statements do not affect rows directly.
public static exec(string $query): intParameters:
| Parameter | Type | Description |
|---|---|---|
$query | string | The SQL query string to execute. |
Return Value:
int - Return number affected rows or 0 if failed.
Throws:
- \Luminova\Exceptions\DatabaseException - Throws an exception if a database error occurs during the operation.
- \Luminova\Exceptions\InvalidArgumentException - Throws if query string is empty.
join
Specifies a table join operation in the query.
This method defines how another table should be joined to the current query.
Join Types:
INNER- Returns only rows with matching values in both tables.LEFT- Returns all rows from the left table and matching rows from the right table, filling inNULLfor non-matching rows.RIGHT- Returns all rows from the right table and matching rows from the left table, filling inNULLfor non-matching rows.CROSS- Returns the Cartesian product of the two tables.FULL- Returns rows with matches in either table, filling inNULLfor non-matching rows.FULL OUTER- Returns all rows from both tables, withNULLin places where there is no match.
public join(string $table, ?string $alias = null, ?string $type = null): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The name of the table to join. |
$alias | string|null | Optional alias for the joined table (default: null). |
$type | string|null | The type of join to perform (e.g, INNER, LEFT, FULL). |
Return Value:
self - Returns the instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if either
$tableor$typeis an empty string.
Example:
Join table with an optional table name an alias:
Builder::table('product', 'p')
->join('users', 'u', 'LEFT');See Also:
leftJoin()rightJoin()innerJoin()crossJoin()fullJoin()
on
Adds a join conditions to the table query.
This method defines a condition for joining tables, allowing comparisons between columns or values.
public on(string $condition, string $comparison, mixed $value, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$condition | string | The column name or condition to join on. |
$comparison | string | The comparison operator (default: =). |
$value | mixed | The value to compare or another table column. - String literals must be wrapped in quotes. - Unquoted values are treated as column names. |
$clause | string | Optional nested clause condition (e.g, AND or OR). |
Return Value:
self - Returns the instance of builder class.
Example:
Using on() for table joins:
Builder::table('users')
->leftJoin('roles', 'r')
->on('u.id', '=', 'r.role_uid') /* Column comparison */
->on('u.user_group', '=', 1) /* Value comparison */
->on('u.user_name', '=', '"peter"'); /* String literal (quoted) */Note: When using multiple joins in one query, always call
on()immediately after eachjoin().
onCompound
Adds a compound join condition combining two column conditions with a connector.
This defines an ON condition that joins two column conditions (or value comparisons) linked by an operator like AND, OR, or any custom SQL operator.
Both columns should use the structure from Builder::column().
public onCompound(array<int,array<string,array>> $columns, string $operator = 'OR', string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$columns | array | The columns conditions (from [Builder::column(...), ...]). |
$operator | string | The operator that connects both column conditions (e.g., AND, OR). |
$clause | string | The outer clause linking this to previous ON conditions (e.g., AND, OR), (default AND). |
Return Value:
self - Returns the instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If empty array columns or invalid was provided.
Example:
Using onCompound() for table joins:
Builder::table('users', 'u')
->leftJoin('contacts', 'c')
->onCompound([
Builder::column('u.id' '=', 'c.contact_uid'),
Builder::column('u.user_group', '=', 2)
]);Note: When using multiple joins in one query, always call
onCompound()immediately after eachjoin().
onClause
Adds a full SQL clause to the current join table condition.
This method allows injecting a complete SQL ON clause expression as-is, useful for complex logic or syntax that can't be represented using standard on() parameters.
public onClause(RawExpression|string $sql, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$sql | RawExpression|string | An SQL string or an instance of raw SQL expression object to use directly in the join. |
$clause | string | Optional logical clause (AND or OR) to combine with previous conditions. |
Return Value:
self - Returns the instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If empty array columns or invalid was provided.
Example:
Using onClause() with custom SQL logic:
Builder::table('users', 'u')
->leftJoin('logs', 'l')
->onClause('(u.id = 100 OR u.id = 200)')
->onClause(Builder::raw('DATE(l.created_at) = CURDATE()'));Note: When using multiple joins in one query, always call
onClause()immediately after eachjoin().
innerJoin
Sets table join condition as INNER JOIN.
public innerJoin(string $table, ?string $alias = null): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The table name to join. |
$alias | string|null | Optional table join alias (default: NULL). |
Return Value:
self - Returns the instance of the class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if invalid argument is provided.
leftJoin
Sets table join condition as LEFT JOIN.
public leftJoin(string $table, ?string $alias = null): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The table name to join. |
$alias | string|null | Optional table join alias (default: NULL). |
Return Value:
self - Returns the instance of the class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if invalid argument is provided.
rightJoin
Sets table join condition as RIGHT JOIN.
public rightJoin(string $table, ?string $alias = null): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The table name to join. |
$alias | string|null | Optional table join alias (default: NULL). |
Return Value:
self - Returns the instance of the class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if invalid argument is provided.
crossJoin
Sets table join condition as CROSS JOIN.
public crossJoin(string $table, ?string $alias = null): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The table name to join. |
$alias | string|null | Optional table join alias (default: NULL). |
Return Value:
self - Returns the instance of the class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if invalid argument is provided.
fullJoin
Sets table join condition as FULL JOIN.
public fullJoin(string $table, ?string $alias = null): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The table name to join. |
$alias | string|null | Optional table join alias (default: NULL). |
Return Value:
self - Returns the instance of the class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if invalid argument is provided.
fullOuterJoin
Sets table join condition as FULL OUTER JOIN.
public fullOuterJoin(string $table, ?string $alias = null): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The table name to join. |
$alias | string|null | Optional table join alias (default: NULL). |
Return Value:
self - Returns the instance of the class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if invalid argument is provided.
limit
Sets the query limit for SELECT statements.
This method adds a LIMIT clause to the query, restricting the number of rows returned and optionally specifying an offset. Useful when working while calling methods like total, select fetch, count, sum and average.
public limit(int $limit, int $offset = 0): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$limit | int | The maximum number of results to return. Must be greater than 0. |
$offset | int | The starting offset for the results (default: 0). |
Return Value:
self - Returns the instance of the builder class.
Example:
Limiting number of results:
$result = Builder::table('users')
->select()
->where('country', '=', 'NG')
->limit(10, 5)
->get();This will generate: LIMIT 5,10
max
Sets a maximum limit for UPDATE or DELETE operations.
This method applies a LIMIT clause to restrict the number of rows affected by UPDATE or DELETE queries.
public max(int $limit): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$limit | int | The maximum number of rows to update or delete. |
Return Value:
self - Return instance of builder class.
Example:
Limiting number of rows to affect, ensuring the query affects at most 50 rows.
$result = Builder::table('users')
->where('country', '=','NG')
->max(50)
->update(['is_local' => 1]);strict
Enable or disable strict conditions for query execution.
When strict mode is enabled, certain operations (e.g., delete, update) may require a WHERE clause or logic operator to prevent accidental modifications of all records. This helps enforce safer query execution.
public strict(bool $strict = true): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$strict | bool | Whether to enable strict mode (default: true). |
Return Value:
self - Returns the instance of the builder class.
Example:
Enabling strict mode:
If no WHERE condition is set, an exception will be thrown.
$result = Builder::table('users')
->strict()
->delete(); Disabling strict mode:
The query will execute even if no WHERE condition is present.
$result = Builder::table('users')
->strict(false)
->delete();order
Applies ascending or descending sorting order specified column for query results.
This method applies an ORDER BY clause to the query, allowing results to be sorted in ascending (ASC) or descending (DESC) order.
public order(string $column, string $order = 'ASC'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The name of the column to sort by. |
$order | string | The sorting direction (default: ASC).(e.g, ASC for ascending, DESC for descending). |
Return Value:
self - Return instance of builder class.
Example:
Ordering results:
$result = Builder::table('users')
->order('created_at', 'DESC')
->select();This will generate: ORDER BY created_at DESC
descending
Applies a descending order to the specified column in the result set.
public descending(string $column): selfParameters:
| Name | Type | Description |
|---|---|---|
$column | string | The name of the column to sort by in descending order. |
Return Value:
self - Returns the instance of the class.
Example:
$result = Builder::table('users')
->descending('created_at')
->select();ascending
Applies an ascending order to the specified column in the result set.
public ascending(string $column): selfParameters:
| Name | Type | Description |
|---|---|---|
$column | string | The name of the column to sort by in ascending order. |
Return Value:
self - Returns the instance of the class.
Example:
$result = Builder::table('users')
->select()
->ascending('username')
->get();orderAgainst
Set the ordering of full-text search results using MATCH ... AGAINST.
This method allows ranking and sorting results based on a full-text search score. Useful when prioritizing rows that better match the search term.
public orderAgainst(
string|int|float $value,
string|int $mode = self::MATCH_NATURAL,
string $order = 'ASC'
): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$value | string|int|float | The value to order search against. |
$mode | string | The match mode, can be a raw string or predefined constant (e.g, Builder::MATCH_*). |
$order | string | The sort direction, either either ASC or DESC (default: ASC). |
Return Value:
self - Returns an instance of the class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If the sort order is invalid.
- \Luminova\Exceptions\DatabaseException - If no match columns have been defined via
match().
See Also:
match()to define match columns.against()to return result using full search.
group
Sets a GROUP BY clause for the query.
This method adds a column to the GROUP BY clause, allowing aggregation of results based on the specified column.
public group(string $group): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$group | string | The name of the column to group by. |
Return Value:
self - Return instance of builder class.
Example:
$result = Builder::table('users')
->select()
->group('country')
->get();This will generate: GROUP BY country
having
Add a filter HAVING expression to the query.
This method allows filtering grouped results using aggregate functions.It appends a HAVING condition to the query, enabling advanced filtering after the GROUP BY clause.
public having(
Luminova\Database\RawExpression|string $expression,
string $comparison,
mixed $value,
string $operator = 'AND'
): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$expression | RawExpression|string | The column or expression to evaluate (e.g, Builder::raw('COUNT(columnName)'),, RawExpression::count('columnName')). |
$comparison | string | The comparison operator (e.g., =, >, <=, etc.). |
$value | mixed | The value to compare against. |
$operator | string | Logical operator to combine with other HAVING clauses (default: 'AND'). |
Return Value:
self - Return instance of builder class.
Example
Filtering Using Having clause:
$result = Builder::table('orders')
->select(['category', 'SUM(sales) AS totalSales'])
->group('category')
->having('totalSales', '>', 1000)
->get()Generates:
SELECT category, SUM(sales) as totalSales
FROM orders
GROUP BY category
HAVING totalSales > 1000Parsing Raw Expression:
$result = Builder::table('orders')
->select(['category'])
->group('category')
->having(RawExpression::sum('amount'), '>=', 1000)
->having(RawExpression::count('order_id'), '>', 10, 'OR')
->get();Generates:
SELECT category
FROM orders
GROUP BY category
HAVING SUM(amount) >= 1000 OR COUNT(order_id) > 10where
Adds a WHERE condition to the query.
This method sets a conditional clause where the specified column must satisfy the given comparison operator and value.
The
wheremethod can be called when working with methods like:select,find,stmt,update,delete,sum,totaloraverage.
public where(string $column, string $comparison, mixed $key): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The name of the column to filter by. |
$comparison | string | The comparison operator (e.g., =, >=, <>, LIKE, IN, NOT). |
$value | mixed | The value to compare against. |
Return Value:
self - Return instance of builder class.
Example:
Using the WHERE conditioning:
Builder::table('users')
->where('status', '=', 'active');This will generate: WHERE status = 'active'
Where In Array:
Using where to check if column in array or not IN or NOT.
Builder::table('users')
->where(
'status', /* Column name*/
'IN', /* Expression (e.g, IN or NOT)*/
['active', 'disabled'] /* Array List */
);Generates: WHERE status IN ('active', 'disabled')
Builder::table('users')
->where('status', 'NOT EXISTS', Builder::raw('(SELECT 1 FROM views WHERE id = 1)'));Generates: WHERE status NOT EXISTS (SELECT 1 FROM views WHERE id = 1)
and
Adds an AND condition to the query.
This method appends an additional condition using the AND operator, requiring multiple conditions to be met.
public and(string $column, string $comparison, mixed $value): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The name of the column to filter by. |
$comparison | string | The comparison operator (e.g., =, >=, <>, LIKE). |
$value | mixed | The value to compare against. |
Return Value:
self - Return instance of builder class.
Example:
Using the AND conditioning:
Builder::table('users')
->where('status', '=', 'active')
->and('role', '=', 'admin');This will generate: WHERE status = 'active' AND role = 'admin'
or
Add a condition to the query using the OR operator.
This method appends a conditional clause where the specified column must satisfy the given comparison operator and value.
public or(string $column, string $comparison, mixed $value): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The name of the column to apply the condition. |
$comparison | string | The comparison operator to use (e.g., =, >=, <>, LIKE). |
$value | mixed | The value to compare the column against. |
Return Value:
self - Return instance of builder class.
Example:
Builder::table('users')
->where('status', '=', 'active')
->or('role', '<>', 'admin');This will generate: WHERE status = 'active' OR role <> 'admin'
whereRaw
Add a raw SQL fragment to the WHERE clause.
Accepts a string or a RawExpression object. This is useful when you need to insert custom SQL that can't be built using structured conditions.
public whereRaw(Luminova\Database\RawExpression|string $sql): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$sql | RawExpression|string | Raw SQL fragment to append to WHERE clause. |
Return Value:
self - Return instance of builder class.
Notes:
- Use this method only when you're sure the input is safe.
- You must include the proper logical operator (e.g. AND, OR) in the raw SQL yourself.
Example:
Builder::table('users')
->select()
->whereRaw('AND status <> "archived"')
->whereRaw(new RawExpression('OR deleted_at IS NULL'))
->get();like
Add a LIKE clause to the query for pattern matching.
public like(string $column, string $expression, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The name of the column to apply the condition. |
$comparison | string | The pattern to match using SQL LIKE (e.g. %value%). |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Example:
Using the LIKE conditioning:
Builder::table('users')
->like('name', '%pet%')
->like('username', '%pet%', 'OR');Generates: WHERE name LIKE '%pet%' OR username LIKE '%pet%'
notLike
Add a NOT LIKE clause to the query to exclude pattern matches.
public notLike(string $column, string $expression, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The name of the column to apply the condition. |
$comparison | string | The pattern to match using SQL NOT LIKE (e.g. %value%). |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Example:
Using the NOT LIKE conditioning:
Builder::table('users')
->notLike('name', '%pet%');Generates: WHERE name NOT LIKE '%pet%'
against
Adds a full-text search clause using MATCH (...) AGAINST (...).
This method appends a full-text AGAINST clause to the query using the match columns defined via match(). It's typically used for searching textual content.
public against(mixed $value, string|int $mode = self::MATCH_NATURAL): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$value | mixed | The value to match against. Can be a string, number, or a Closure to defer value evaluation. |
$mode | string | The match mode, can be a raw string or predefined constant (e.g, Builder::MATCH_*). |
Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\DatabaseException - If match columns are missing or invalid.
See Also:
match()to define match columns.orderAgainst()to order using full search.
nullable
Adds a condition to filter results where the given column is NULL or NOT NULL.
This method appends a null match based on "$clause" condition to the query. It ensures that only records with a null or non-null value in the specified column are retrieved.
public nullable(string $column, bool $isNull = true, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The column name to check for non-null values. |
$isNull | bool | Whether the the column should be null or not (default: true). |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Example:
Builder::table('users')
->where('country', '=', 'NG')
->nullable('address')
->select();isNotNull
Adds a condition to filter results where the given column is NOT NULL.
This method appends an AND column IS NOT NULL condition to the query.It ensures that only records with a non-null value in the specified column are retrieved.
public isNotNull(string $column, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The column name to check for non-null values. |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Example usage:
Builder::table('users')
->where('country', '=', 'NG')
->isNotNull('address')
->select();isNull
Adds a condition to filter results where the given column is NULL.
This method appends an AND column IS NULL condition to the query.It ensures that only records with a null value in the specified column are retrieved.
public isNull(string $column, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The column name to check for null values. |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Example usage:
Builder::table('users')
->where('country', '=', 'NG')
->isNull('address')
->select();clause
Adds a complex conditional clause directly to the current table query builder.
This method allows flexible WHERE logic by supporting multiple condition types. It can be used to directly append conditions while manually constructing queries, bypassing higher-level helpers like where() or match().
Supported Modes:
Builder::REGULAR— Standard comparison (e.g.,WHERE column = value)Builder::CONJOIN— Combined expressions (e.g.,WHERE (a = 1 OR b = 2))Builder::NESTED— Deeply grouped conditions (e.g.,WHERE ((a = 1 AND b = 2) OR (c = 3)))Builder::AGAINST— Full-text match usingMATCH (...) AGAINST (...)Builder::INARRAY— Filters usingIN (...)orNOT IN (...)with array values
public clause(
string $clause,
string $column,
string $comparison,
mixed $value,
?string $mode = null
): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$clause | string | The logical connector: typically (AND or OR). |
$column | string | The column to apply the condition on. |
$comparison | mixed | The comparison operator (=, <>, >=, LIKE, etc.). |
$value | mixed | The condition value to compare. Can be scalar or array (for Builder::INARRAY). |
$mode | string|null | The clause mode. One of the supported modes (default: Builder::REGULAR). |
Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If an unsupported mode is given or if
Builder::INARRAYis used with an empty array.
Example Usage:
$builder = Builder::table('users')
->select()
->clause('AND', 'id', '=', 100)
->clause('OR', 'id', '=', 101)
->clause('AND', 'name', '=', 'Peter')
->clause('AND', 'roles', 'IN', ['admin', 'editor'], Builder::INARRAY)
->get();This will generate: SELECT * FROM users WHERE id = 100 OR id = 101 AND name = 'Peter' AND roles IN ('admin', 'editor')
Internal:
Used internally by the builder to compose query conditions.Can also be called directly to manually define clauses without relying on higher-level methods likewhere(),or(), oragainst().Useful when you want full control and to skip additional processing.
condition
Adds a conditional clause to the query builder using scalar or array values.
Supports both regular WHERE conditions and array-based IN/NOT IN clauses.
Note:
- When
$valueis an array, it is transformed into anINorNOT INclause depending on$comparison.
'IN'→WHERE column IN (...)'NOT'→WHERE column NOT IN (...)
public condition(string $clause, string $column, string $comparison, mixed $value): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$clause | string | The logical connector: typically (AND or OR). |
$column | string | The column to apply the condition on. |
$comparison | mixed | The comparison operator (=, <>, >, LIKE, IN, NOT, etc.). |
$value | mixed | The value to compare against. Array for IN/NOT IN queries. |
Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - IIf an error occurs.
Example Usage:
$builder = Builder::table('users')
->select()
->condition('AND', 'id', '=', 100)
->condition('OR', 'id', '=', 101)
->condition('AND', 'name', '=', 'Peter')
->condition('AND', 'roles', 'IN', ['admin', 'editor'])
->get();set
Set the columns and values to be updated in the query.
This method should be invoked before the update() method to specify which columns to update.
public set(string $column, mixed $value): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The name of the column to update. |
$value | mixed | The value to set for the column. |
Return Value:
self - Return instance of builder class.
Example:
Setting update columns and values:
Builder::table('users')
->set('status', 'active')
->set('updated_at', time())
->update();This will generate: UPDATE table SET status = 'active', updated_at = 1699999999
column
Define a column condition for use in nested and conjoin queries.
This method simplifies the process of specifying a column condition with a comparison operator and a value.It is particularly useful when used within methods like conjoin(), nested(), 'andConjoin()', orConjoin()orNested() or andNested().
public static column(string $name, string $comparison, mixed $value): array<string,array>Parameters:
| Parameter | Type | Description |
|---|---|---|
$name | string | The name of the column. |
$comparison | string | The comparison operator (e.g., =, !=, <, >, LIKE). |
$value | mixed|Closure | The value to compare against. |
Return Value:
array<string,array> - Returns an array representing a column structure.
bind
Binds a join named placeholder parameter to a value.
Use this method to manually assign a value to a named placeholder—typically used within a join condition where dynamic values are required.
public bind(string $placeholder, mixed $value): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$placeholder | string | The named placeholder. Must start with a colon : (e.g. :id). |
$value | mixed | The value to bind to the placeholder. Arrays are JSON encoded. |
Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If the placeholder does not start with a colon
:.
Example:
$result = Builder::table('users', 'u')
->select()
->innerJoin('orders', 'o')
->on('o.order_uid', '=', 'u.uid')
->on('o.order_id', '=', ':order_number') /* Placeholder to bind */
->bind(':order_number', 13445) /* Bind value */
->where('u.uid', '=', 100)
->get();Note: This method is intended for join conditions only. Using it elsewhere may cause an exception.
conjoin
Conjoin multiple conditions using either AND or OR.
This method creates a logical condition group where conditions are combined using the specified operator.
public conjoin(
array<int,array<string,array<string,mixed>>> $conditions,
string $operator = 'AND',
string $clause = 'AND'
): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$conditions | array | The conditions to group. Or Luminova\Database\column(...) method for simplified builder. |
$operator | string | The join logical operator (AND or OR) within each group (default: AND). |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Example:
Using conjoin and in array search.
$followings = [1001, 1002, 1003];
$result = Builder::table('posts')
->where('country', '=', 'NG')
->conjoin([
Builder::column('is_trending', '=', 1),
Builder::column('author_id', 'IN', $followings)
], 'OR', 'AND')
->get();Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if invalid group operator is specified.
Examples:
Group conditions:
Builder::table('fooTable')
->conjoin([
['column1' => ['comparison' => '=', 'value' => 1]],
['column2' => ['comparison' => '=', 'value' => 2]]
], 'OR');Using Column method:
Builder::table('fooTable')
->conjoin([
Builder::column('column1', '=', 1),
Builder::column('column2', '=', 2)
], 'OR');Generates: ... WHERE (column1 = 1 OR column2 = 2)
orConjoin
Groups multiple conditions using the OR operator.
This method uses conjoin method to creates a logical condition group where at least one condition must be met.
public orConjoin(array<int,array<string,array<string,mixed>>> $conditions, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$conditions | array | The conditions to be grouped with OR. |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Example:
Builder::table('fooTable')
->orConjoin([
Builder::column('column1', '=', 1),
Builder::column('column2', '=', 2),
/* ... */
]);Generates: ... WHERE (column1 = 1 OR column2 = 2)
andConjoin
Groups multiple conditions using the AND operator.
This method uses conjoin method creates a logical condition group where all conditions must be met.
public andConjoin(array<int,array<string,array<string,mixed>>> $conditions, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$conditions | array | The conditions to be grouped with AND. |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Example:
Builder::table('fooTable')
->andConjoin([
Builder::column('column1', '=', 1),
Builder::column('column2', '=', 2),
/* ... */
]);Generates: WHERE (column1 = 1 AND column2 = 2)
nested
Creates a nested condition group by combining two condition sets.
This method groups two sets of conditions and binds them with the specified logical operator.
public nested(
array<int,array<string,array<string,mixed>>> $conditions1,
array<int,array<string,array<string,mixed>>> $conditions2,
string $operator = 'AND',
string $nestedOperator = 'AND',
string $clause = 'AND'
): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$conditions1 | array | The first condition group. Or Luminova\Database\column(...) method for simplified builder. |
$conditions2 | array | The second condition group. |
$operator | string | The join logical operator (AND or OR) within each group (default: AND). |
$nestedOperator | string | The nested logical operator (AND or OR) to bind the groups (default: AND). |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if invalid group operator is specified.
Examples:
Generating a nested conditions:
Builder::table('fooTable')
->where('fooUser', '=', 100)
->nested([
['foo' => ['comparison' => '=', 'value' => 1]],
['bar' => ['comparison' => '=', 'value' => 2]]
],
[
['baz' => ['comparison' => '=', 'value' => 3]],
['bra' => ['comparison' => '=', 'value' => 4]]
],
'OR', /* Group condition */
'AND' /* Nested condition */
);Using Column:
Builder::table('fooTable')
->where('fooUser', '=', 100)
->nested([
Builder::column('column1', '=', 1),
Builder::column('column2', '=', 2)
],
[
Builder::column('column1', '=', 1),
Builder::column('column2', '=', 2)
],
'OR', /* Group condition */
'AND' /* Nested condition */
);Generates: ... WHERE fooUser = 100 AND ((foo = 1 OR bar = 2) AND (baz = 3 OR bra = 4))
orNested
Binds two condition groups using the OR operator.
This method creates two logical condition groups and combines them using OR.
AND- Groups are combined with AND (e.g.,WHERE ((a OR b) AND (c OR d))).OR- Groups are combined with OR (e.g.,WHERE ((a OR b) OR (c OR d))).
public orNested(
array<int,array<string,array<string,mixed>>> $group1,
string $joinOperator,
array<int,array<string,array<string,mixed>>> $group2,
string $clause = 'AND'
): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$group1 | array | The first condition group. |
$joinOperator | string | The logical operator to bind both group (e.g, AND, OR). |
$group2 | array | The second condition group. |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Example:
Generating a query with nested OR conditions:
Builder::table('fooTable')
->orNested([
Builder::column('foo', '=', 1),
Builder::column('bar', '=', 2),
/* ... */
],
'AND',
[
Builder::column('baz', '=', 3),
Builder::column('bra', '=', 4),
/* ... */
]);Generates: ... WHERE ((foo = 1 OR bar = 2) AND (baz = 3 OR bra = 4))
andNested
Binds two condition groups using the AND operator.
This method creates two logical condition groups and combines them using AND.
AND- Groups are combined with AND (e.g.,WHERE ((a AND b) AND (c AND d))).OR- Groups are combined with OR (e.g.,WHERE ((a AND b) OR (c AND d))).
public andNested(
array<int,array<string,array<string,mixed>>> $group1,
string $joinOperator,
array<int,array<string,array<string,mixed>>> $group2,
string $clause = 'AND'
): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$group1 | array | The first condition group. |
$joinOperator | string | The logical operator to bind both group (e.g, AND, OR). |
$group2 | array | The second condition group. |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Example:
Generating a query with nested AND conditions:
Builder::table('fooTable')
->andNested([
Builder::column('foo', '=', 1),
Builder::column('bar', '=', 2),
/* ... */
],
'OR',
[
Builder::column('baz', '=', 3),
Builder::column('bra', '=', 4),
/* ... */
]);Generates: ... WHERE ((foo = 1 AND bar = 2) OR (baz = 3 AND bra = 4))
in
Set query to search using IN () expression.
This method allows you to set an array-value expressions to search for a given column name.
public in(string $column, \Closure|array<int,string|int|float> $list, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The column name to search. |
$list | Closure|array | The array expression values. |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If values is not provided.
- \Luminova\Exceptions\JsonException - If an error occurs while encoding values.
notIn
Adds find NOT IN condition to search using NOT IN() expression.
This method creates a condition where the specified column's value is not in the provided list.
public notIn(string $column, \Closure|array<int,string|int|float> $list, string $clause = 'AND'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The name of the column to check against the list. |
$list | Closure|array | An array or Closure that returns array of values to check against. |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If the provided list is empty.
inset
Add a condition for FIND_IN_SET expression for the given column name.
Default Operators:
exists,>- Check if exists or match any in the list.first,=- Check if it's the first in the list.last- Check if it's the first in the list.position- Position in the list (as inset_position).contains- Check if it contains the search term (uses the$searchas the search value).none- No match in the list.
public inset(
string $search,
string $comparison,
array<int,mixed>|string $list,
bool $isSearchColumn = false,
string $clause = 'AND'
): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$search | string | The search value or column name depending on $isSearchColumn. |
$comparison | string | The comparison operator for matching (e.g., exists, first, >= foo, <= bar). |
$list | array<int,mixed>|string | The comma-separated values or a column name containing the list. |
$isSearchColumn | bool | Whether the $search argument is a column name (default: false). |
$clause | string | Logical clause to chain with (e.g., AND, OR). |
Return Value:
self - Returns the instance of the builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if list value is not empty.
Usage Examples:
Using the custom Operator:
Builder::table('fruits')
->inset('banana', '= 2', ['apple','banana','orange']);Using the exists Operator with a column:
Builder::table('employees')
->inset('PHP', 'exists', 'columnName_language_skills');Using the exists Operator with a search column:
Builder::table('employees')
->inset('department', 'exists', 'HR,Finance,Marketing', true);returns
Set result return type to an object, array or prepared statement object.
This method changes the default result return type from and object to either array or statement object.
public returns(string $type): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$type | string | The result return type (e.g, Builder::RETURN_OBJECT, Builder::RETURN_ARRAY or Builder::RETURN_STATEMENT). |
Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - Throws if an invalid type is provided.
Note: Call method before
fetch,findselectetc...
raw
Creates a new raw SQL expression.
This method is used to pass raw SQL expressions that should not be escaped or quoted by the query builder. It is useful for performing operations like COUNT(*), NOW(), or scores + 1 directly in queries.
public static raw(string $expression): Luminova\Database\RawExpressionParameters:
| Parameter | Type | Description |
|---|---|---|
$expression | string | The raw SQL expression. |
Return Value:
Luminova\Database\RawExpression - Return instance of RawExpression, representing the raw SQL string.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If an empty string is passed.
Examples:
Using RawExpression in a SELECT Query
use Luminova\Database\Builder;
$users = Builder::table('users')
->select(['id', 'name', Builder::raw('COUNT(*) OVER() AS totalRecords')])
//->find(['id', 'name', Builder::raw('COUNT(*) OVER() AS totalRecords')])
->group('id')
->limit(5);Using RawExpression in an UPDATE Query
use Luminova\Database\Builder;
Builder::table('posts')
->where('id', '=', 5)
->update([
'views' => Builder::raw('views + 1'),
'updated_at' => Builder::raw('NOW()')
]);Using RawExpression in an INSERT Query
use Luminova\Database\Builder;
Builder::table('logs')->insert([
'message' => 'User login',
'created_at' => Builder::raw('NOW()')
]);datetime
Helper method to get a formatted date/time string for SQL storage.
Available formats:
time→ HH:MM:SS (e.g.,14:30:45)datetime→ YYYY-MM-DD HH:MM:SS (e.g.,2025-04-03 14:30:45)date→ YYYY-MM-DD (e.g.,2025-04-03)unix→ UNIX timestamp (e.g.,1712256645)
public static datetime(
string $format = 'datetime',
DateTimeZone|string|null $timezone = null,
?int $timestamp = null
): stringParameters:
| Parameter | Type | Description |
|---|---|---|
$format | string | The format to return (default: datetime). |
$timezone | DateTimeZone|string|null | Optional timezone string or object (default: null). |
$timestamp | int|null | Optional UNIX timestamp to format; uses current time if null. |
Return Value:
string - Return formatted date/time or UNIX timestamp.
escape
Escapes a value for safe use in SQL queries.
This method handles various types and formats them appropriately:
null,bool, and numeric values are cast based on the$strictflag.- Arrays and objects are encoded as JSON. Existing valid JSON strings are preserved.
RawExpressioninstances are returned as-is, unescaped.Resourceare read usingstream_get_contentsand returned string contents.- Strings can optionally be escaped with
addslashes()and/or wrapped in quotes.
$strict
If true:
nullreturnsnullinstead of'NULL'boolreturnstrue|falseinstead of1|0resourcereturnscontentinstead ofbase64encoded- Empty arrays return
[]instead of'[]'
If false:
nullreturns'NULL'(as string)boolreturns1|0resourcereturnsbase64encoded contents.- Empty arrays return
'[]'
$numericCheck
- Enables
+0cast andJSON_NUMERIC_CHECKfor JSON encoding. - If false, numeric strings are preserved as-is.
public static escape(
mixed $value,
bool $enQuote = false,
bool $strict = false,
bool $numericCheck = false,
bool $addSlashes = false
): mixedParameters:
| Parameter | Type | Description |
|---|---|---|
$value | mixed | The value to escape. |
$enQuote | bool | If true, wraps the value in single quotes (except for JSON). |
$strict | bool | Whether to use strict type casting (default: false). |
$numericCheck | bool | If true, numeric strings are cast to int/float (default: false). |
$addSlashes | bool | If true, string values are passed through addslashes(). |
Return Value:
string|float|bool|int|null - Returns a properly escaped and type-safe value.
Throws:
\JsonException- If JSON encoding fails for arrays or objects.Luminova\Exception\DatabaseException- If value is resource and failed to read content.
cacheable
Globally enable or disabled all caching for subsequent select operations.
This method provides the flexibility to enable or disable all caches universally. This is particularly useful for debugging or temporarily disabling database caching throughout your application without the need to manually remove cache() method calls from your all code.
public cacheable(bool $enable): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$enable | bool | The caching status action (e.g, true or false). |
Return Value:
self - Return instance of builder class.
Note: By default caching is enabled once you call the
cachemethod.
distinct
Enable or disable flag distinct selection for query executions.
public distinct(bool $distinct = true): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$distinct | bool | Whether to apply distinct selection (default: true). |
Return Value:
self - Return instance of builder class.
replace
Enable or disable replace feature when inserting or copying records in the current database table.
Applicable To:
insert()- Before calling insert() method.copy()- Before to() method.
If enabled, insert method will replaces existing records, by first deleting existing rows with the same primary key or unique key before inserting new ones.
Note: This may lead to unintended data loss, especially if foreign key constraints exist.
public replace(bool $useReplace = true): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$useReplace | bool | Set to true to use REPLACE instead of INSERT (default: true). |
Return Value:
self - Return instance of builder class.
Warning: Since
replaceremoves and re-inserts data, it can reset auto-increment values and trigger delete/insert events instead of update events.
closeAfter
Sets the auto-close connection status for the current query.
This method allows you to control whether the database connection should be automatically closed after executing the query.By default, the connection remains open after query execution.
public closeAfter(bool $close = true): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$close | bool | Whether to automatically close the connection after executing the query (default: true). |
Return Value:
self - Return instance of builder class.
cacheDelete
Deletes the cached data associated with current table or a specific database table.
This method clears cached data for a specified table and subfolder within the cache system. It supports both file-based and memory-based caching (e.g., Memcached). If no table is specified, it defaults to the table name associated with the current instance.
public cacheDelete(?string $storage = null, ?string $subfolder = null, ?string $persistentId = null): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$storage | string|null | Optional storage name for the cache. Defaults to the current table name or 'capture' if not specified. |
$subfolder | string|null | Optional file-based caching feature, the subfolder name used while storing the cache if any (default: null). |
$persistentId | string|null | Optional memory-based caching feature, to set a unique persistent connection ID (default: __database_builder__). |
Return Value:
bool - Returns true if the cache was successfully cleared; otherwise, false.
cacheDeleteAll
Deletes all cached items for the specified subfolder or the default database cache.
public cacheDeleteAll(?string $subfolder = null, ?string $persistentId = null): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$subfolder | string|null | Optional file-based caching feature, the subfolder name used while storing caches if any (default: null). |
$persistentId | string|null | Optional memory-based caching feature, to set a unique persistent connection ID (default: __database_builder__). |
Return Value:
boo - Returns true if the cache was successfully flushed, false otherwise.
cache
Configures and manages caching for current query operation, to cache query result response, and return cached data when next user request the same content.
This method sets up the caching mechanism based on the provided parameters.It supports both memory-based caching (e.g., Memcached) and file-based caching.The method determines if the cache for the given key exists and whether it has expired.
public cache(
string $key,
?string $storage = null,
\DateTimeInterface|int $expiry = 7 * 24 * 60 * 60,
?string $subfolder = null,
?string $persistentId = null
): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$key | string | The unique key identifying the cache item. |
$storage | string|null | Optional storage name for the cache (it's recommended to void storing large data in one file when using file-based cache). Defaults to the current table name or 'capture' if not specified. |
$expiry | \DateTimeInterface|int | The cache expiration time (default: to 7 days). |
$subfolder | string|null | Optional file-based caching feature, to set subfolder within the cache root directory (default: database). |
$persistentId | string|null | Optional memory-based caching feature, to set a unique persistent connection ID (default: __database_builder__). |
Return Value:
self - Return instance of builder class.
Note: In other for caching to work, you must call
cachemethod beforeselect,find,execute,fetch,sum,averageortotalmethod is called.Additionally, usingstmtmethod for returning statement object doesn't support caching, you will need to manually implement it if need.
Throws:
- \Luminova\Exceptions\CacheException - Throws if an error occurs while creating cache or reading expired cache.
insert
Insert records into a specified database table.
This method allows for inserting multiple records at once by accepting an array of associative arrays. Each associative array should contain the column names as keys and their corresponding values as values.
Optionally use the set method to to prepare inset values.
Note: If the insert value is an array, it will be converted to
JSONencoded string, if wish to insert a serialized string, you should do that before passing the value.
public insert(array<int,array<string,mixed>> $values, bool $usePrepare = true, bool $escapeValues = true): intParameters:
| Parameter | Type | Description |
|---|---|---|
$values | array | An array of associative arrays, where each associative array represents a record to be inserted into the table.. |
$usePrepare | bool | If set to true, uses prepared statements with bound values for the insert operation. If false, executes a raw query instead (default: true). |
$escapeValues | bool | Whether to escape insert values if $usePrepare is true (default: true). |
Return Value:
int - Returns the number of affected rows, 0 if no rows were inserted.
Throws:
- \Luminova\Exceptions\DatabaseException - Throws if an error occurs during the insert operation or if the provided values are not associative arrays.
- \Luminova\Exceptions\JsonException - Throws if an error occurs while encoding array values to JSON format.
Example:
Using RawExpression in an INSERT Query.
use Luminova\Database\RawExpression;
$result = Builder::table('logs')->insert([
[ /* Row 1 */
'message' => 'User login',
'created_at' => Builder::raw('NOW()'),
'updated_at' => RawExpression::now()
],
[ /* Row 2 */
'message' => 'User update',
'created_at' => Builder::raw('NOW()'),
'updated_at' => RawExpression::now()
],
/* More rows... */
]);Using REPLACE instead of INSERT:
Builder::table('logs')
->replace(true)
->insert([
'message' => 'User login',
'created_at' => Builder::raw('NOW()')
]);onDuplicate
Specifies an action to take when a duplicate key conflict occurs during an INSERT operation.
This method allows defining custom update operations when a record with a duplicate key is encountered.
Supported operations:
=→ Replace the value (e.g.,email = '[email protected]').+=→ Increment the existing value (e.g.,points = points + 10).-=→ Decrement the existing value (e.g.,points = points - 5).
public onDuplicate(string $column, string $operation, mixed $value): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The column to update on duplicate key. |
$operation | string | The operation to apply (=, +=, -=). |
$value | mixed | The new value or increment amount. |
Return Value:
self - Return instance of builder class.
Example:
Builder::table('users')
->onDuplicate('points', '=', 'VALUES(points)')
->onDuplicate('points', '+=', 10) /* Increment points by 10 on duplicate key */
->onDuplicate('email', '=', '[email protected]') /* Update email on duplicate key */
->insert([
[
'id' => 1,
'name' => 'Alice',
'points' => 50,
'email' => '[email protected]'
]
]);ignoreDuplicate
Sets whether duplicates should be ignored during insertion.
This method allows you to control the behavior of handling duplicate keys.When set to true, duplicate keys will be ignored. If set to false, the default behavior is to handle duplicates as normal (which may result in an error or update based on the context).
public ignoreDuplicate(bool $ignore = true): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$ignore | bool | Whether to ignore duplicates (default: true). |
Return Value:
self - Return instance of builder class.
Example:
Ignore duplicates during insertion:
Builder::table('users')
->ignoreDuplicate()
->insert([
[
'id' => 1,
'name' => 'Alice',
'points' => 50,
'email' => '[email protected]'
]
]);copy
Prepares a selection query to copy data from the current table.
This method selects the specified columns in preparation for copying them into another table using the to() method to execute copy operation.
public copy(array $columns = ['*']): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$columns | array<int,string> | List of columns to select for copying (defaults: ['*']). |
Return Value:
self - Return instance of builder class.
Example:
Prepare a copy of specific columns
use Luminova\Database\RawExpression;
Builder::table('users')
->copy(['id', 'email', 'created_at'])
->where('id', '=', 1)
->onDuplicate('email', '=', RawExpression::values('email'))
/* ->replace(true) // Optionally use REPLACE instead of INSERT */
->to(
'backup_users', /* Destination table */
['id', 'email', 'created_at']
);to
Executes a prepared copy() query and inserts its result into the specified target table.
This method finalizes a copy() operation by executing the selection and inserting the results into another table using either INSERT, INSERT IGNORE, or REPLACE.
public to(string $table, array $columns = ['*']): intParameters:
| Parameter | Type | Description |
|---|---|---|
$table | string | The target table to insert copied data into. |
$columns | array<int,string> | Target table columns to insert data into. |
Return Value:
int - Return the number of affected rows, or 0 if no rows were inserted or if debugging is enabled.
Throws:
- \Luminova\Exceptions\DatabaseException - If copy mode isn't active, or if column mismatch occurs.
- \Luminova\Exceptions\InvalidArgumentException - If the target table name is empty.
- \Luminova\Exceptions\JsonException - If copy operation involves JSON-encodable values and encoding fails.
warning Ensure that source and destination columns match in count and structure.
execute
Executes an SQL query that was previously set using the query() method.
Caching
To cache the query result, call the cache() method before invoking execute(). If caching is enabled and a cached result exists, the method returns the cached value immediately.
Parameter Binding
This method supports placeholder binding via an associative array. The key represents the placeholder name, and the value is the corresponding value to bind.
- If placeholders are provided, the query is executed using prepared statements.
- If no placeholders are given, the query is executed directly. Ensure that all values in the query are properly escaped to prevent SQL injection.
Available Return Modes:
RETURN_ALL→ Returns all rows (default).RETURN_NEXT→ Returns a single row or the next row from the result set.RETURN_2D_NUM→ Returns a 2D array with numerical indices.RETURN_ID→ Returns the last inserted ID.RETURN_COUNT→ Returns the number of affected rows.RETURN_COLUMN→ Returns columns from the result.RETURN_INT→ Returns an integer count of records.RETURN_STMT→ Returns a PDO or MySQLi prepared statement object.RETURN_RESULT→ Returns a MySQLi result object or a PDO statement object.
public execute(
?array<string,mixed> $placeholder = null,
int $returnMode = RETURN_ALL,
int $fetchMode = FETCH_OBJ,
bool $escapePlaceholders = false
): mixedParameters:
| Parameter | Type | Description |
|---|---|---|
$placeholder | array<string,mixed>|null | An optional associative array of placeholder to bind with query. |
$returnMode | int | The result return mode e.g, RETURN_* (default: RETURN_ALL). |
$fetchMode | int | The result fetch mode (default: FETCH_OBJ). |
$escapePlaceholders | bool | Whether to escape placeholders if any (default: true). |
Return Value:
mixed - Returns the query result, a database driver interface for prepared statement object, or false on failure.
Throws:
- \Luminova\Exceptions\DatabaseException - If placeholder key is not a valid string or an error occur.
Fetch and Return Modes
- Refer to the Luminova constants documentation for details on database result modes.
Example:
Executing a prepared query:
$stmt = Builder::query("SELECT * FROM users WHERE id = :user_id");
$result = $stmt->execute(['id' => 1]);
// Fetching a single row:
$user = $stmt->execute(['id' => 1], RETURN_NEXT, FETCH_ASSOC);total
Add query to calculate the total number of records in selected table.
When get, promise, stmt or fetch method is called, it returns int, the total number of records in table, otherwise 0 if no result.
public total(string $column = '*'): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The column to index calculation (default: *). |
Return Value:
self - Return instance of builder class.
exists
Determine if a database table exists.
This method determines whether the specified table name exists in the database.
public exists(): boolReturn Value:
bool - Return true if table exists in database, otherwise false.
Throws:
- \Luminova\Exceptions\DatabaseException - Throw if an error occurs.
Example:
Check if user table exists in database:
if(Builder::table('users')->exists()){
echo 'Table exists in database';
}has
Determine of a records exists in table.
This method executes the current query to determine if a records exists in current table name.
public has(): boolReturn Value:
bool - Return true if records exists in table, otherwise false.
Throws:
- \Luminova\Exceptions\DatabaseException - Throw if an error occurs.
Example:
Check if users in country Nigeria exists in table:
if(Builder::table('users')->where('country', '=', 'NG')->has()){
echo 'Users in Nigeria exists';
}sum
Add query to calculate the total sum of a numeric column in the current table.
When get, promise, stmt or fetch method is called, it returns int|float, the total sum columns, otherwise 0 if no result.
public sum(string $column): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The column to calculate the sum. |
Return Value:
self - Return instance of builder class.
average
Add query to calculate the average value of a numeric column in the current table.
When get, promise, stmt or fetch method is called, it returns int|float, the total average of columns, otherwise 0 if no result.
public average(string $column): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$column | string | The column to calculate the average. |
Return Value:
self - Return instance of builder class.
find
Add query to select a single/next record from current table.
When get, promise, stmt or fetch method is called, it returns object|null|array|int|float|bool, the selected single row, otherwise false if execution failed.
public find(array<int,string> $columns = ['*']): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$columns | array<int,string> | An array of table columns to return (default: [*]). |
Return Value:
self - Return instance of builder class.
select
Add query to select multiple records from the current table.
When get, promise, stmt or fetch method is called, it returns object|null|array|int|float|bool, the selected rows, otherwise false if execution failed.
public select(array<int,string> $columns = ['*']): self
Parameters:
| Parameter | Type | Description |
|---|---|---|
$columns | array<int,string> | An array of table columns to return (default: [*]). |
Return Value:
self - Return instance of builder class.
columns
Sets the columns to be used in a UNION or UNION ALL operation.
This method specifies which columns should be included when combining results from multiple queries using union or unionAll. By default, all columns (*) are included.
Samples:
- Basic:
['id', 'name', 'email'] - Alias:
['foo_id AS id', 'foo_name AS name', 'foo_email AS']
public columns(array $columns = ['*']): self
Parameters:
| Parameter | Type | Description |
|---|---|---|
$columns | array<int,string> | The columns to include in the union operation (default: [*]). |
Return Value:
self - Return instance of builder class.
union
Combines the current query with another using the UNION operator.
Ensures both queries have the same number of columns. Resulting rows will be distinct.
public union(Luminova\Database\Builder|\Closure $union): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$union | Builder|Closure | Another Builder instance or closure that return (Builder or null) to union with. |
Return Value:
self - Return current parent Builder object.
Throws:
- \Luminova\Exceptions\DatabaseException - If error occurs.
Example:
unionAll and union have similar implementation and both support defining union in closure.
$active = Builder::table('users')->select(['id', 'email'])
->where('status', '=', 'active');
$inactive = Builder::table('users')->select(['id', 'email'])
->where('status', '=', 'inactive');
$all = $active->union($inactive)
->descending('id')
//->columns(...)
//->where(...)
//->or(...)
//->in(...)
//->conjoin(...)
//->group(...)
//->order(...)
->limit(10)
->get();Note: When using union tables, do not call
get,fetchorstmtbefore adding table to another.Always call after all tables has been added.
unionAll
Combines the current query with another using the UNION ALL operator.
Unlike UNION, this includes duplicate rows from both queries.
public unionAll(Luminova\Database\Builder|\Closure $union): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$union | Builder|Closure | Another Builder instance or closure that return (Builder or null) to union with. |
Return Value:
self - Return current parent Builder object.
Throws:
- \Luminova\Exceptions\DatabaseException - If error occurs.
Note: When using union tables, do not call
get,fetchorstmtbefore adding table to another.Always call after all tables has been added.
unionAlias
Sets the alias for the combined unions subquery.
Useful when applying filters, sorting, or pagination to the result of a UNION query.
public unionAlias(string $alias): self Parameters:
| Parameter | Type | Description |
|---|---|---|
$alias | string | The alias to assign to the UNION result set. |
Return Value:
self - Returns the instance of the builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If the invalid alias was provided.
Note: This alias is used to wrap the UNION result in an outer SELECT statement like:
SELECT [alias].column FROM ( ... UNION ... ) AS [alias]
match
Defines columns to be used for a full-text search match.
This method registers a set of columns for a subsequent AGAINST clause in a full-text query. Multiple calls to this method will stack multiple MATCH (...) AGAINST (...) clauses.
public match(array $columns): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$columns | array<int,string|int> | An array of column names to include in the full-text match. All column names must be valid SQL column identifiers.. |
Return Value:
self - Return current parent Builder object.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If the columns array is empty or contains invalid entries.
Examples:
Add match columns for full-text search.
Builder::table('blogs')
->select()
->match(['title', 'description'])
->against('fast laptop', Builder::MATCH_BOOLEAN)
->match(['title', 'description'])
->against('low laptop', Builder::MATCH_NATURAL)
->get();Match against title/description and order by relevance score.
Builder::table('blogs')
->select()
->match(['title', 'description'])
->orderAgainst('wireless keyboard', Builder::MATCH_BOOLEAN, 'DESC')
->get();get
Executes the current query and returns result(s).
This method allows to execute prepared query and return the result based on $fetchMode and $returnMode or specified return type from returns method.
public get(int $fetchMode = FETCH_OBJ, ?int $returnMode = null): mixedParameters:
| Parameter | Type | Description |
|---|---|---|
$fetchMode | int | The result fetch mode (e.g., FETCH_OBJ, FETCH_ASSOC), (default: FETCH_OBJ). |
$returnMode | int | Optional return mode (e.g., RETURN_ALL, RETURN_NEXT).Defaults to internal handler or RETURN_ALL. |
Return Value:
mixed - Return the query result on success, or false/null on failure.
Throws:
- \Luminova\Exceptions\DatabaseException - If no query to execute or execution fails.
Example
Execute query method:
$result = Builder::table('users')
->select(['email', 'name'])
->where('country', '=', 'NG')
->get(FETCH_OBJ);fetch
Executes and fetch one row at a time (for while loops or streaming).
The fetch method allows you to read records one after the other, by passing desired fetch mode and result type.
public fetch(int $mode = FETCH_OBJ): mixedParameters:
| Parameter | Type | Description |
|---|---|---|
$mode | int | Database fetch result mode FETCH_* (default: FETCH_OBJ). |
Return Value:
mixed - Return selected records, otherwise false if execution failed.
Throws:
- \Luminova\Exceptions\DatabaseException - If no query to execute or execution fails.
Note: Fetch method uses statement for execution, so it doesn't support query result caching.
Example:
$stmt = Builder::table('users')
->select(['email', 'name'])
->where('country', '=', 'NG');
while($row = $stmt->fetch(FETCH_OBJ)){
echo $row->email;
}
$stmt->freeStmt();stmt
Executes the current query and returns prepared statement object.
For more information about the methods available in the DatabaseInterface statement object, see the Database Driver Documentation.
public stmt(): ?Luminova\Interface\DatabaseInterfaceReturn Value:
Luminova\Interface\DatabaseInterface|null - Return prepared statement if query is successful otherwise null.
Throws:
- \Luminova\Exceptions\DatabaseException - If no query to execute or execution fails.
Note: Statement doesn't support query result caching.
Example
Execute query in statement method:
$stmt = Builder::table('programming')
->select(['name', 'type'])
->where('language', '=', 'PHP')
->stmt();Using returns to specify returning statement object:
$query = Builder::table('programming')
->find(['name', 'type'])
->where('language', '=', 'PHP')
->returns(Builder::RETURN_STATEMENT);
$stmt = $query->get();
// Close query statement when done
$query->freeStmt() // Or $query->free();Now you can call any result execution method from database driver object as needed:
// Fetch Class
$user = $stmt->fetchObject(User::class);
// Fetch All
$result = $stmt->fetchAll(FETCH_OBJ);
// Fetch All
$result = $stmt->fetchAll(FETCH_OBJ);
// Fetch and Read next
while($row => $stmt->fetch(RETURN_STREAM, FETCH_OBJ)){
echo $row->name;
}
$stmt->free();promise
Executes the current query and returns results wrapped in a Promise.
This method allows asynchronous handling of database operations when used with. It resolve or reject if error occurs during execution.
public promise(int $fetchMode = FETCH_OBJ, ?int $returnMode = null): PromiseInterfaceParameters:
| Parameter | Type | Description |
|---|---|---|
$fetchMode | int | The result fetch mode (default: FETCH_OBJ). |
$returnMode | int | The result return mode (default: RETURN_ALL). |
Return Value:
Luminova\Interface\PromiseInterface - Returns a promise that resolves with query results.
Example
Execute query in promise resolver method:
Builder::table('users')
->select(['email', 'name'])
->where('country', '=', 'NG')
->promise(FETCH_OBJ)
->then(function (mixed $result) {
echo $result->name;
})->catch(function (\Throwable $e) {
echo $e->getMessage();
});update
Execute query to update to the current table with columns and values.
This method constructs and executes an UPDATE statement based on the current query conditions.It ensures that strict mode prevents execution without a WHERE clause, reducing the risk of accidental override.
public update(?array<string,mixed> $setValues = null): intParameters:
| Parameter | Type | Description |
|---|---|---|
$setValues | array<string,mixed>|null | An optional associative array of columns and values to update if not already set defined using set method. |
Return Value:
int - Returns the number of affected rows.
Throws:
- \Luminova\Exceptions\DatabaseException - Thrown if an error occurs while updating.
- \Luminova\Exceptions\JsonException - Thrown if an error occurs while encoding values.
Note: If you pass an array value to an update field, it will be automatically converted to a
JSONstring. Ensure that your table field is designed to acceptJSONstrings before passing an array.
Example:
Update table with columns and values:
Builder::table('users')
->where('id', '=', 1)
->strict(true) /* Enable or disable strict where clause check */
->update([
'updated_at' => Builder::datetime(),
'scores' => Builder::raw('scores + 1')
]);Update table preparing columns and values using set method:
Builder::table('users')
->where('id', '=', 1)
->set('updated_at', Builder::datetime())
->set('scores', Builder::raw('scores + 1'))
->update();Update table with join clause:
Builder::table('users', 'u')
->innerJoin('post', 'p')
->on('u.id', '=', 'p.post_uid')
->where('u.id', '=', 1)
->update([
'u.last_update' => Builder::datetime(),
'p.views' => Builder::raw('p.views + 1')
]);delete
Execute query to delete records from the current table.
This method constructs and executes a DELETE statement based on the current query conditions.It ensures that strict mode prevents execution without a WHERE clause, reducing the risk of accidental deletions.
public delete(): intReturn Value:
int - Return number of affected rows.
Throws:
- \Luminova\Exceptions\DatabaseException - Throw if error occurs.
Example:
Delete table column:
Builder::table('users')
->where('id', '=', 1)
->strict(true) /* Enable or disable strict where clause check */
->delete();rename
Rename the current table to a new name.
This method constructs and executes a DELETE statement based on the current query conditions.It ensures that strict mode prevents execution without a WHERE clause, reducing the risk of accidental deletions.
public rename(string $to): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$to | string | The new table name. |
Return Value:
bool - Return true if the rename operation was successful, false otherwise.
Throws:
- \Luminova\Exceptions\DatabaseException - If the database driver is unsupported or error occur.
Example:
Rename table name.
Builder::table('users')
->rename('new_users');transaction
Begins a transaction with optional read-only isolation level and SAVEPOINT for PDO.
Transaction Flags:
- For MySQLi: use
MYSQLI_TRANS_START_READ_ONLYto set transaction as read-only. - For PDO: No predefined flags, specify
4to create read-only isolation.
public transaction(int $flags = 0, ?string $name = null): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$flags | int | Optional flags to set transaction properties (default: 0). |
$name | string|null | Optional transaction name to use. If provided in PDO, SAVEPOINT will be created with name instead. |
Return Value:
bool - Returns true if the transaction was successfully started, otherwise false.
Throws:
- \Luminova\Exceptions\DatabaseException - Throws exception on
PDOif failure to set transaction isolation level or createsavepoint.
Note:
If
$flagsis set to4inPDO, which is equivalent toMYSQLI_TRANS_START_READ_ONLY, a read-only isolation level will be established. If the transaction starts successfully, it will return true.If
$nameis specified inPDO, aSAVEPOINTwill be created. If the savepoint creation is successful, the transaction will return true.
Example:
$tbl = Builder::table('users')
->transaction()
->where('country', '=', 'NG');
if($tbl->update(['suburb' => 'Enugu'])){
$tbl->commit();
}else{
$tbl->rollback();
}
$tbl->free();commit
Commits a transaction.
public commit(int $flags = 0, ?string $name = null): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$flags | int | Optional flags to set transaction properties. (Default: 0).Only supported in MySQLi. |
$name | string|null | Optional name. Only supported in MySQLi. |
Return Value:
bool - Returns true if the transaction was successfully committed, otherwise false.
rollback
Rolls back the current transaction or to a specific name while in PDO uses SAVEPOINT.
public rollback(int $flags = 0, ?string $name = null): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$flags | int | Optional flags to set transaction properties. (Default: 0).Only supported in MySQLi. |
$name | string|null | Optional name. If provided in PDO, rolls back to the SAVEPOINT named |
Return Value:
bool - Return true if rolled back was successful, otherwise false.
Throws:
- \Luminova\Exceptions\DatabaseException - Throws exception on
PDOif failure to createSAVEPOINT.
safeMode
Enables or disables safe mode for write and altering current table.
When enabled, supported operations will automatically run inside an internal transaction only if no transaction is already active. This protects against partial updates and makes operations more fault-tolerant during development or testing.
public safeMode(bool $enable = true): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$enable | bool | Whether to enable or disable safe mode (default: true). |
Return Value:
self - Returns the current builder instance.
Applies to:
insert()update()delete()drop()truncate()copy()temp()
truncate
Truncate database table records.
This method will attempt to clear all table records and optionally reset table auto-increment.
public truncate(?int $restIncrement = null): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$restIncrement | bool | Index to reset auto-increment if applicable (default null). |
Return Value:
bool - Return true truncation was completed, otherwise false.
Throws:
- \Luminova\Exceptions\DatabaseException - Throws if execution encountered error.
Example:
Builder::table('users')->truncate();temp
Creates a temporary table and copies all records from the main table to the temporary table.
public temp(): boolReturn Value:
bool - Returns true if the operation was successful; false otherwise.
Throws:
- \Luminova\Exceptions\DatabaseException - Thrown if a database error occurs during the operation.
Note:Temporary tables are automatically deleted when the current session ends.You won't find these tables in
phpMyAdminor any other database manager as they are session-specific.To query a temporary table, use thetemp_prefix before the main table name.
Example
if (Builder::table('users')->temp()) {
$data = Builder::table('temp_users')->select();
}drop
Drops a database table or a temporary table if it exists.
When $isTemporalTable is set to true, the temporal created table of the current table will be dropped instead.
public drop(bool $isTemporalTable = false): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$isTemporalTable | bool | Whether the table is a temporary table (default false). |
Return Value:
bool - Return true if table was successfully dropped, false otherwise.
Throws:
- \Luminova\Exceptions\DatabaseException - Throws if error occurs.
Examples:
This will drop the users table from the database.
Builder::table('users')
->drop(); // Table 'users' was droppedThis will drop the users temporal table from the database.
Builder::table('users')
->drop(true); // Table 'temp_users' was droppedlockFor
Apply a row-level lock to the query for concurrency control.
Call this method before executing find() or similar fetch operations. Must be used within a transaction.
Lock Modes:
'update': Exclusive lock. Allows reads, blocks writes by others.'shared': Shared lock. Allows others to read, but not write.
public lockFor(string $mode = 'update'): self Parameters:
| Parameter | Type | Description |
|---|---|---|
$mode | string | The lock mode: 'update' or 'shared' (default: update). |
Return Value:
self - Return instance of builder class.
Throws:
- \Luminova\Exceptions\InvalidArgumentException - If invalid lock type is given.
Note: Must be used inside a transaction.
Examples:
Lock rows for update (exclusive lock):
$tbl = Builder::Table('users');
$tbl->transaction();
$rows = $tbl->where('id', '=', 123)
->lockFor('update') /* Prevents others from reading or writing */
->find();
$tbl->commit();Lock rows for shared read (shared lock):
$tbl = Builder::Table('users');
$tbl->transaction();
$rows = $tbl->where('id', '=', 123)
->lockFor('shared') /* Allows others to read, but not write */
->find();
$tbl->commit();lock
Handles database-level locking using advisory locks for PostgreSQL and MySQL.
- PostgreSQL: Uses
pg_advisory_lockandpg_advisory_unlock, requiring an integer lock name. - MySQL: Uses
GET_LOCK,RELEASE_LOCK, andIS_FREE_LOCK, allowing string lock names.
public static lock(string|int $identifier, int $timeout = 300): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$identifier | string|int | Lock identifier (must be an integer for PostgreSQL). |
$timeout | int | Lock timeout in seconds (only applicable for MySQL). |
Return Value:
bool - Return true if the operation was successful, false otherwise.
Throws:
- \Luminova\Exceptions\DatabaseException - If an invalid action is provided or an invalid PostgreSQL lock name is used.
unlock
Releases the lock for the given name.
public static unlock(string|int $identifier): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$identifier | string|int | Lock identifier (must be an integer for PostgreSQL). |
Return Value:
bool - Return true if the lock was successfully released, false otherwise.
Throws:
- \Luminova\Exceptions\DatabaseException - If an invalid action is provided or an invalid PostgreSQL lock name is used.
isLocked
Checks if the given lock is free.
public static isLocked(string|int $identifier): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$identifier | string|int | Lock identifier (must be an integer for PostgreSQL). |
Return Value:
bool - Return true if the lock is free, false if it is currently held.
Throws:
- \Luminova\Exceptions\DatabaseException - If an invalid action is provided or an invalid PostgreSQL lock name is used.
isConnected
Check if database connected.
public static isConnected(): boolReturn Value:
bool - Return true if database connected, false otherwise.
manager
Returns the shared instance of the database manager class, initialized with the current database connection. The manager object can be used to create database table backups or export entire tables in CSV or JSON format.
public manager(): Luminova\Database\ManagerReturn Value:
Luminova\Database\Manager - An instance of the database manager class.
Throws:
- \Luminova\Exceptions\DatabaseException - Throws if database connection failed.
See Also:
Database Manager - Detailed documentation on the database manager.
**
export
Exports the current database table and prompts the browser to download it as a JSON or CSV file. This method utilizes the manager class for the export operation.
public export(string $as = 'csv', ?string $filename = null, array $columns = ['*']): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$as | string | The format to export the table in, either csv or json. |
$filename | string|null | The name of the file to download (optional). |
$columns | array | The table columns to export (default: all columns). |
Return Value:
bool - Returns true if the export is successful, false otherwise.
Throws:
- \Luminova\Exceptions\DatabaseException - If an invalid format is specified or if the export operation fails.
backup
Creates a backup of the current database table and saves the backup file in the writeable/backups directory. This method utilizes the manager class for the backup operation.
public backup(?string $filename = null): boolParameters:
| Parameter | Type | Description |
|---|---|---|
$filename | string|null | Optional name of the backup file (default: null). If not provided, table name and timestamp will be used. |
Return Value:
bool - Return true if backup is successful, false otherwise.
Throws:
- \Luminova\Exceptions\DatabaseException - If unable to create the backup directory or if failed to create the backup.
errors
Retrieves the last query execution errors.
public errors(): arrayReturn Value:
array - Return an array containing error information from the last executed query.
debug
Enables debugging for query execution.
Supports multiple debug modes for tracking or dumping query strings and parameters.To print debug information call dump(...) or printDebug(...).
Modes:
Builder::DEBUG_BUILDER: Collects metadata (e.g., query strings and parameters).Builder::DEBUG_BUILDER_DUMP: Immediately outputs query strings and parameters.Builder::DEBUG_DRIVER: Enables driver-level debugging (e.g., PDO, MySQLi).Builder::DEBUG_NONE: Disable debugging.
public debug(int $mode = self::DEBUG_BUILDER_DUMP): selfParameters:
| Parameter | Type | Description |
|---|---|---|
$mode | int | Debug mode to activate (default: Builder::DEBUG_BUILDER_DUMP). |
Note: When debug is enabled, execution will not succeed, the result response can either be (
false,nullor0), depending on the result execution method called.
Return Value:
self - Returns the instance of the builder class.
Note: In production, debug information is logged using the
debuglevel when applicable.
Example:
$tbl = Builder::table('users')
->debug(Builder::DEBUG_BUILDER)
->where('id', '=', 1001);
$result = $tbl->select();
// Get an array of debug information
print_r($result->getDebug());
// Or print the debug information
$result->dump('html');Using the debug mode DEBUG_BUILDER_DUMP will print the sql query and params as it process
$tbl = Builder::table('users')
->debug(Builder::DEBUG_BUILDER_DUMP)
->where('id', '=', 1001);
$result = $tbl->select();Output Format:
SQL QUERY
SELECT * FROM users
WHERE id = :id
QUERY PARAMS
:id = 1001dump
Print the debug query information in the specified format.
This method prints a detailed debug information about the query execution and for the last statement execution. It includes formats for MySQL and PDO SQL queries, as well as the binding mappings for each column.
If no format is provided or running is CLI/command mode, defaults to print_r without any formatting.
Supported formats:
null→ Print a readable array (default),html→ Format output in htmlpre.json→ Output as json-pretty print.
public dump(?string $format = null): voidParameters:
| Parameter | Type | Description |
|---|---|---|
$format | string|null | Optional output format (e.g, html, json or NULL).The format is only applied when debug mode is Builder::DEBUG_BUILDER_DUMP |
reset
Reset query builder executions to default as needed.
This method frees the database statement cursor if not in transaction and returns is not a statement object.
public reset(): trueReturn Value:
true - Always return true.
Note: It automatically closes database connection if
closeAfteris enabled.
free
Frees up the statement cursor and sets the statement object to null.
If in transaction, it will return false, you can free when transaction is done (e.g, committed or rollback).
public free(): boolReturn Value:
bool - Return true if successful, otherwise false.
Note: It will automatically closes database connection if
closeAfteris enabled.
close
Close database connection.
This method closes the current connection attached to query instance and also all open connection in pool.
public close(): boolReturn Value:
bool - Return true if database connection is close, otherwise false.
close
Free statement cursor after executing result using stmt method.
public freeStmt(): trueReturn Value:
true - Always return true.