Salt la conținut

Query Builder

Query builder-ul db() oferă acces direct la baza de date fără a trece prin modele ORM. Este util pentru interogări complexe, agregări, DDL și operațiuni care nu se potrivesc pe un singur model.

Funcția db()

// Conexiunea implicită (din config/database.php)
$conn = db();

// Conexiune numită
$conn = db('company');
$conn = db('workleto');

// Dotted notation: instance + database override
$conn = db('workleto.company_data');

Funcția returnează o instanță Connection care expune builder-e fluente pentru fiecare tip de operațiune.


SELECT

// Select simplu
$users = db('company')
    ->select('id', 'name', 'email')
    ->from('users')
    ->where('active', 1)
    ->orderBy('name')
    ->limit(10)
    ->resultset();

// Select cu *
$all = db()->select('*')->from('modules')->resultset();

// O singură celulă (scalar)
$count = db('company')
    ->select('COUNT(*)')
    ->from('users')
    ->cell();

// O singură coloană
$names = db('company')
    ->select('name')
    ->from('users')
    ->col();

// Un singur rând
$user = db('company')
    ->select('*')
    ->from('users')
    ->where('id', 1)
    ->single();

WHERE

db('company')->select()->from('users')
    ->where('status', 'active')               // egal
    ->where('age', '>', 18)                   // operator explicit
    ->where('name', 'LIKE', '%Ion%')          // LIKE
    ->where('id', 'IN', [1, 2, 3])            // IN
    ->where('deleted_at', null)               // IS NULL
    ->orWhere('role', 'admin')                // OR
    ->whereGroup(function ($q) {              // grup cu paranteze
        $q->where('a', 1)->orWhere('b', 2);
    })
    ->resultset();

JOIN, GROUP BY, HAVING

db('company')
    ->select('u.name', 'COUNT(o.id) as order_count')
    ->from('users u')
    ->leftJoin('orders o', 'u.id = o.user_id')
    ->groupBy('u.id')
    ->having('order_count', '>', 5)
    ->orderBy('order_count', 'DESC')
    ->resultset();

Paginare

$results = db('company')
    ->select('*')
    ->from('users')
    ->orderBy('name')
    ->page(1, 20)      // pagina 1, câte 20
    ->resultset();

INSERT

// Inserare simplă
db('company')->insert('users', [
    'name' => 'Ion Popescu',
    'email' => 'ion@example.com',
]);

// Obține ID-ul inserat
$id = db('company')->insert_id();

Exemplu real:

db()->insert('companies', [
    'name' => $nume,
    'namespace' => $namespace,
    'package' => $package,
]);

UPDATE

db('company')
    ->update('users')
    ->set('name', 'Nume nou')
    ->set('email', 'email@nou.com')
    ->where('id', 1)
    ->execute();

Exemplu real:

db('company')->update('company_api_tokens', [
    'last_used' => date('Y-m-d H:i:s'),
    'count' => $token['count'] + 1,
])
->where('token_uuid', $tokenUuid)
->execute();

DELETE

db('company')
    ->delete('users')
    ->where('id', 1)
    ->execute();

Exemplu real:

db()->delete('modules')
    ->where('module_name', $moduleName)
    ->execute();

Tranzacții

db('company')->transaction(function () {
    db('company')->insert('orders', ['total' => 100]);
    $orderId = db('company')->insert_id();

    db('company')->insert('order_items', [
        'order_id' => $orderId,
        'product_id' => 5,
        'quantity' => 2,
    ]);
});

Metoda transaction() execută closure-ul într-o tranzacție — face commit automat la final sau rollback dacă apare o excepție.


DDL

// CREATE TABLE
db()->createTable('logs', function ($table) {
    $table->id();
    $table->string('message', 500);
    $table->text('context');
    $table->timestamp('created_at');
});

// ALTER TABLE
db()->alterTable('users')
    ->addColumn('phone', 'VARCHAR(20)')
    ->execute();

// DROP TABLE
db()->dropTable('temp_data');

// TRUNCATE
db()->truncate('sessions');

cell(), single(), col(), resultset()

MetodăReturnează
resultset()array de rânduri (array-uri asociative)
single()Un singur rând (array asociativ) sau null
cell()O singură valoare scalară (prima coloană)
col()Un array cu valorile unei singure coloane

Conexiuni multiple

// Conectare la baza de date a unei companii specifice
$db = db('workleto.' . DB_PREFIX_COMPANY_DATA . $companyNamespace);
$data = $db->select('*')->from('users')->resultset();

Dotted notation-ul workleto.nume_db refolosește configurația instanței workleto dar schimbă baza de date.