Salt la conținut

Operațiuni CRUD

Operațiuni CRUD pe modele

find()

Găsește o înregistrare după cheia primară:

$user = User::find(1);                  // Returnează User sau null

Pentru chei primare compuse, folosește forma array (exemplu real din proiectul Triatlon):

$score = Score::find([
    'student_id' => $student->id,
    'event_id'   => $event->id
]);
$result = ModelCompus::find(['key1' => 1, 'key2' => 2]);

where() & friends

where() este o metodă statică care pornește o interogare nouă. Metodele înlănțuite (andWhere, orWhere, andWhereGroup, orWhereGroup) continuă interogarea curentă.

use Leto\Database\ORM\Enums\Order;

// Condiții simple
$users = User::where('active', 1)->get();

// Multiple condiții (AND)
$users = User::where('active', 1)
    ->andWhere('role_id', 2)
    ->get();

// OR
$users = User::where('role', 'admin')
    ->orWhere('role', 'moderator')
    ->get();

// Grupare cu paranteze (în interiorul unei interogări existente)
$users = User::where('active', 1)
    ->andWhereGroup(function ($q) {
        $q->where('role', 'admin')
          ->orWhere('permissions', 'LIKE', '%manage%');
    })
    ->get();

all(), get(), first(), count()

// Toate înregistrările
$users = User::all()->get();

// Colecție filtrată
$users = User::where('active', 1)->get();

// Prima înregistrare
$first = User::where('email', $email)->first();

// Numără
$count = User::where('active', 1)->count();

orderBy, limit, offset

use Leto\Database\ORM\Enums\Order;

User::where('active', 1)
    ->orderBy('name', Order::ASC)
    ->orderBy('created_at', Order::DESC)
    ->limit(20)
    ->offset(0)
    ->get();

Poți folosi și orderBy('name') fără al doilea parametru — implicit e Order::ASC.

paginate()

Semnătură: paginate(int $page, int $resultsPerPage, ?array &$paginationInfo = null)

// Pagina 1, câte 20 pe pagină
$page = User::where('active', 1)
    ->orderBy('name', Order::ASC)
    ->paginate(1, 20);

// Cu informații de paginare
$paginationInfo = null;
$users = User::all()->paginate(1, 20, $paginationInfo);

// $paginationInfo conține:
//   first_result, last_result, total_results,
//   total_pages, current_page, results_per_page

create()

create() este o metodă de instanță, nu statică. Creezi un obiect, îi populezi proprietățile, apoi apelezi create():

$user = new User();
$user->name = 'Maria Popescu';
$user->email = 'maria@example.com';
$user->role_id = 2;
$user->active = true;
$user->create();

Metoda create() populează automat câmpul auto-increment după salvare.

update()

Actualizare individuală (prin modificarea instanței):

$user = User::find(1);
$user->name = 'Nume nou';
$user->update();

Actualizare bulk (mai multe înregistrări deodată):

User::where('active', 0)
    ->set('archived', true)
    ->update();

delete()

Ștergere individuală:

$user = User::find(1);
$user->delete();

Ștergere bulk:

User::where('created_at', '<', '2020-01-01')->delete();

refresh()

Reîncarcă modelul din baza de date, anulând modificările locale:

$user = User::find(1);
$user->name = 'Modificare temporară';
$user->refresh();  // $user->name revine la valoarea din DB

Tranzacții

use Leto\Database\DB;

DB::transaction(function () {
    $order = new Order();
    $order->customer_id = 1;
    $order->create();

    foreach ($items as $item) {
        $oi = new OrderItem();
        $oi->order_id = $order->id;
        $oi->product_id = $item['product_id'];
        $oi->quantity = $item['quantity'];
        $oi->create();
    }
    // Dacă orice operațiune eșuează, totul se anulează
});

whereUnsafe / setUnsafe

Pentru cazurile rare când ai nevoie de SQL raw neescapuit. setUnsafe primește un singur string — expresia SQL completă.

// whereUnsafe pornește o interogare raw
User::whereUnsafe('YEAR(created_at)', 2025)->get();

// setUnsafe — un singur argument, expresia completă
$user = User::find(1);
$user->setUnsafe('login_count = login_count + 1');
$user->update();
Atenție! whereUnsafe și setUnsafe pot cauza SQL injection dacă argumentele vin din inputul utilizatorului. Folosește-le doar cu valori hardcodate.