©Sergey Emelyanov 2025 | Alle Rechte vorbehalten
In der Webentwicklung spielen Query Builder eine zentrale Rolle bei der Interaktion mit Datenbanken. Sie ermöglichen es, SQL-Abfragen dynamisch und programmatisch aufzubauen – mit einer lesbaren, flüssigen Syntax. In Laravel, einem der beliebtesten PHP-Frameworks, wird dies durch den Illuminate\Database\Eloquent\Builder realisiert, der Teil der Eloquent ORM ist.
Doch in komplexen Systemen wie CRM-Anwendungen (Customer Relationship Management) stößt der Standard-Builder schnell an Grenzen. Hier kommen spezialisierte Query Builder ins Spiel: Sie erweitern die Basisklasse, kapseln komplexe Abfragelogik und halten Modelle clean.
Angenommen, wir entwickeln ein CRM mit folgenden Anforderungen:
Mit einem Standard-Builder würde die Logik in Controllern oder Services landen – das führt zu Code-Duplikation und unübersichtlichen Modellen. Die Lösung: Eigene Builder-Klassen!
class CustomerBuilder extends Builder
{
public function whereHasRecentOrders(): self
{
$oneMonthAgo = now()->subMonth();
return $this->whereHas('orders', function ($query) use ($oneMonthAgo) {
$query->where('created_at', '>=', $oneMonthAgo);
});
}
}
Verwendung:
$activeCustomers = Customer::whereHasRecentOrders()
->where('country', 'DE')
->get();
class TransactionBuilder extends Builder
{
public function totalSpentByCustomer(Customer $customer): float
{
return $this->where('customer_id', $customer->id)
->sum('amount');
}
}
Verwendung:
$totalSpent = Transaction::totalSpentByCustomer($customer);
class InvoiceBuilder extends Builder
{
public function markAsPaid(): void
{
$this->model->paid_at = now();
$this->model->save();
}
}
Verwendung:
Invoice::find($invoiceId)->markAsPaid();
Damit Laravel den Custom Builder verwendet, muss die newEloquentBuilder-Methode im Model überschrieben werden:
class Customer extends Model
{
public function newEloquentBuilder($query): CustomerBuilder
{
return new CustomerBuilder($query);
}
}
Spezialisierte Query Builder sind ein Game-Changer für Laravel-Entwickler, insbesondere in großen CRM-Systemen. Sie ermöglichen es, komplexe Abfragen lesbar und wartbar zu kapseln – ganz im Sinne des Single-Responsibility-Prinzips.
Weiterführende Tipps:
Mit diesem Ansatz bleibt Ihr Code auch in wachsenden Projekten organisiert und anpassbar.
©Sergey Emelyanov 2025 | Alle Rechte vorbehalten