Wolff\Core\DB
You can run queries using the Database class of Wolff. It's basically an abstraction layer builded on top of PDO, meaning that it simplifies the process of running queries and is also safe and reliable.
Keep in mind that the PHP PDO extension must be installed and enabled for the database to work.
The database constructor looks like this.
__construct([array $data[, array $options ]])
It takes two parameters, an array with the database credentials, and an array which will be used as the options for the PDO instance that the utility uses internally.
If no data array is passed, it will use the credentials defined in the db key of the system/config.php file array.
$db = new Wolff\Core\DB();
$db = new Wolff\Core\DB([
    'dsn'      => 'mysql:host=localhost;dbname=testdb'
    'username' => 'root',
    'password' => '12345',
]);
Both examples are right.
query(string $sql[, ...$args]): \Wolff\Core\Query
The query method returns a Wolff\Core\Query object.
$db->query('SELECT * FROM table');
You can prepare a query passing multiple parameters after the first one.
$db->query('SELECT * FROM user WHERE id = ?', $id);
$db->query('SELECT * FROM user WHERE name = ? and email = ?', $name, $email);
The Wolff\Core\Query object returned by the query method has the following method.
get(): array
Returns the query result as an associative array.
$db->query('SELECT * FROM table')->get();
getJson(): string
Returns the result as a JSON.
$db->query('SELECT * FROM table')->getJson();
limit(int $start[, int $end]): array
Returns the query result as an associative array sliced.
$db->query('SELECT * FROM table')->limit(0, 5);
In that example only 5 rows will be returned.
first([string $column]): array
Returns the first element of the query result.
$db->query('SELECT * FROM table')->first();
You can pass a column name to the method. That will return only the specified column value of the first element.
$db->query('SELECT * FROM table')->first('column');
count(): int
Returns the number of query rows.
$db->query('SELECT * FROM table')->count();
pick(...$columns): array
Returns the query result only with the specified columns.
$db->query('SELECT * FROM users')->pick('name');
That would return something like this:
Array
(
    [0] => Margaret Brown
    [1] => Thomas Andrews
    [2] => Bruce Ismay
)
$db->query('SELECT * FROM users')->pick('name', 'age');
That would return something like this:
Array
(
    [0] => Array
        (
            [name] => Margaret Brown
            [age] => 40
        )
    [1] => Array
        (
            [name] => Thomas Andrews
            [age] => 45
        )
)
dump(): void
Var dump the query result.
$db->query('SELECT * FROM table')->dump();
dumpd(): void
Var dump the query result and die.
$db->query('SELECT * FROM table')->dumpd();
printr(): void
Prints the query result in a nice looking way.
$db->query('SELECT * FROM table')->printr();
printrd(): void
Prints the query result in a nice looking way and die.
$db->query('SELECT * FROM table')->printrd();
getPdo(): ?\PDO
Returns the PDO object.
$db->getPdo();
getLastId(): ?string
Returns the last inserted ID in the database.
$db->getLastId();
getLastStmt(): \PDOStatement
Returns the last PDO statement executed.
$db->getLastStmt();
getLastSql(): mixed
Returns the last query executed.
$db->getLastSql();
And you can get its arguments with getLastArgs.
$db->getLastArgs();
Finally you can re run the last query with runLastSql.
$db->runLastSql();
tableExists(string $table): bool
Returns true if the specified table exists, false otherwise.
$db->tableExists('users');
WARNING: This method must NOT be used with user input since it does not escapes the given arguments.
columnExists(string $table, string $column): bool
Returns true if the specified table and column exists, false otherwise.
$db->columnExists('users', 'user_id');
The first parameter is the table where the column is, the second is the column name.
WARNING: This method must NOT be used with user input since it does not escapes the given arguments.
moveRows(string $src_table, string $dest_table[, string $conditions[, $args]]): bool
Moves rows from the source table to the destination table.
This method returns true if the transaction has been made successfully, false otherwise.
$db->moveRows('customers', 'new_customers', 'WHERE status = 1');
In case of errors, the changes are completely rolled back.
WARNING: This method must NOT be used with user input since it does not escapes the given arguments.
The DB class has some fast methods you can use.
insert(string $table, array $data): mixed
Inserts the given data into the specified table.
The first parameter must be the table name where the data will be inserted, the second parameter must be an associative array with data.
Take in mind that the array keys will be directly mapped to the column names.
$db->insert('product', [
    'name'     => 'phone',
    'model'    => 'PHN001',
    'quantity' => 5,
]);
That will be the same as INSERT INTO 'product' (name, model, quantity) VALUES ('phone', 'PHN001', '5').
select(string $table[, string $conditions[, ...$args]]): array 
Runs a select query in the specified table.
This method returns the result as an associative array, and accepts dot notation.
$db->select('users');
$db->select('users', 'id = ?', 1);
$db->select('users.name');
Equivalent to:
SELECT * FROM users
SELECT * FROM users WHERE id = 1.
SELECT name FROM users.
count(string $table[, string $conditions[, ...$args]]): int
Returns the number of rows in the specified table.
$db->count('users');
$db->count('users', 'id = ?', 1);
Equivalent to:
SELECT COUNT(*) FROM users
SELECT COUNT(*) FROM users WHERE id = 1.
delete(string $table[, string $conditions[, ...$args]]): bool
Deletes the rows in the specified table.
This method returns true in case of success, false otherwise.
$db->delete('users');
$db->delete('users', 'id = ?', 1);
Equivalent to:
DELETE * FROM users
DELETE * FROM users WHERE id = 1.