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();whereUnsafe și setUnsafe pot cauza SQL injection dacă argumentele vin din inputul utilizatorului. Folosește-le doar cu valori hardcodate.