Exotosche Laravel Eloqent functies
Artikel met exotische Laravel Eloqent functies.... nou ja, functies die ik niet vaak zie of nieuw zijn in Laravel.
whereAny
Where statements 'nesten'
User::where('name', 'like', '%John%')
->orWhere('email', 'like', '%John%')
->get();
Naar
User::whereAny(['name', 'email'], 'like', '%John%')
->get();
WhereAll
Alle kolommen moeten voldoen, om bijvoorbeeld alle laptops te selecteren.
Product::whereAny(['name', 'description', 'sku'], 'like', '%laptop%')
->get();
Tegenovergestelde, whereNone
Als alle kolommen niet voorkomen, bijvoorbeeld actieve orders.
Orders::whereNone(['status', 'quality_check', 'shipping_status'], '=', 'blocked')
->get();
whereColumn
Alle orders ophalen die niet genoeg voorraad hebben
Orders::whereColumn('quantity_ordered', '>', 'quantity_in_stock')
->get();
Je kan ook arrays gebruiken, bijvoorbeeld haal alle orders op die niet in de aanbieding zijn en niet genoeg voorraad hebben.
Orders::whereColumn([
['selling_price', '=', 'discount_price'],
['quantity_ordered', '>', 'quantity_in_stock']
])->get()
Of juist wel orders in de aanbieding, en niet genoeg voorraad.
Orders::whereColumn([
['selling_price', '>', 'discount_price'],
['quantity_ordered', '>', 'quantity_in_stock']
])->get()
whereJsonContains
Zoeken in een Json kolom
User::whereJsonContains('roles', 'admin')->get();
Zoeken in een json kolom op json/string lengte
Product::whereJsonLength('tags', 3)->get();
Full-text search (MySQL/PostgreSQL)
Product::whereFullText(['title', 'content'], 'laptop')->get();
Dit is vaak sneller met grote hoeveelheden records om doorheen te zoeken dan met een where like statement. Uiteraard moet je nog wel een ->fullText() index zetten in je migratie, https://laravel.com/docs/12.x/migrations#available-index-types
whereBetweenColumns
Zoeken tussen een range, in plaats van hardcoded waardes met whereBetween kan je ook kolommen nemen als array params. Bijvoorbeeld alle producten ophalen die niet aan het minimum voorraad voldoen.
Products::whereBetweenColumns('stock', ['min_stock', 'max_stock'])->get();
latest() & oldest()
Order::latest('shipped_at')->get();
withWhereHas()
Haalt gebruikers met actieve orders + hun actieve orders.
User::withWhereHas('orders', function ($query) {
$query->where('status', 'active');
})->get();
Bulk insert/update
Visit::updateOrCreate(
['ip_address' => request()->ip()],
['last_visit' => now()]
);
DB::table('flights')->upsert(
[
['departure' => 'Oakland', 'destination' => 'San Diego', 'price' => 99],
['departure' => 'Chicago', 'destination' => 'New York', 'price' => 150]
],
['departure', 'destination'], // unieke sleutels
['price'] // kolommen om te updaten
);
User::upsert([
['email' => 'john@example.com', 'name' => 'John'],
['email' => 'jane@example.com', 'name' => 'Jane']
], ['email'], ['name']);
De email is de unieke key/sleutel en name de data die toegoevoegd of bijgewerkt moet worden.
| Functie | Doel | Werking |
|---|---|---|
| insert() | Bulk insert meerdere rijen | Inserts zonder events, faalt bij conflicts |
| insertOrIgnore() | Bulk insert, negeert duplicates | Inserts en negeert duplicate errors |
| updateOrInsert() | Update of insert één record | Update als bestaat, anders insert |
| upsert() | Bulk update of insert (insert or update batch) | Bulk upsert op basis van unieke kolom |
| create() | Eloquent per record insert met events en validatie | Insert met model events, niet bulk |
CSV of XML
Om CSV of XML data data met bulk toe te voegen kan je uiteraard ook de insert functie van Laravel gebruiken maar je zou nog steeds de data moeten parsen naar een array. Een betere en veel snellere manier is de mysql functie LOAD DATA INFILE te gebruiken.