Retrieving Results
Alle Zeilen aus einer Tabelle abrufen
Sie können die table-Methode auf der DB-Facade verwenden, um eine Abfrage zu starten. Die table-Methode gibt eine fließende Query Builder-Instanz für die angegebene Tabelle zurück, so dass Sie weitere Einschränkungen auf die Abfrage verketten und dann schließlich die Ergebnisse mit der Get-Methode erhalten können:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* Show a list of all of the application's users.
*
* @return Response
*/
public function index()
{
$users = DB::table('users')->get();
return view('user.index', ['users' => $users]);
}
}
Die get-Methode gibt eine Illuminate\Support\Collection zurück, die die Ergebnisse enthält, wobei jedes Ergebnis eine Instanz des PHP stdClass Objekts ist. Sie können auf den Wert jeder Spalte zugreifen, indem Sie auf die Spalte als Eigenschaft des Objekts zugreifen:
foreach ($users as $user) {
echo $user->name;
}
Retrieving A Single Row / Column From A Table
Wenn Sie nur eine einzelne Zeile aus der Datenbanktabelle abrufen müssen, können Sie die first-Methode verwenden. Diese Methode gibt ein einzelnes stdClass Objekt zurück:
$user = DB::table('users')->where('name', 'John')->first();
echo $user->name;
Wenn Sie nicht einmal eine ganze Zeile benötigen, können Sie einen einzelnen Wert aus einem Datensatz mit der value-Methode extrahieren. Diese Methode gibt den Wert der Spalte direkt zurück:
$email = DB::table('users')->where('name', 'John')->value('email');
Um eine einzelne Zeile nach ihrem Spaltenwert id abzurufen, verwenden Sie die find-Methode:
$user = DB::table('users')->find(3);
Retrieving A List Of Column Values
Wenn Sie eine Collection mit den Werten einer einzelnen Spalte abrufen möchten, können Sie die pluck-Methode verwenden. In diesem Beispiel werden wir eine Sammlung von Rollentiteln abrufen:
$titles = DB::table('roles')->pluck('title');
foreach ($titles as $title) {
echo $title;
}
Sie können auch eine benutzerdefinierte Schlüsselspalte für die zurückgegebene Sammlung angeben:
$roles = DB::table('roles')->pluck('title', 'name');
foreach ($roles as $name => $title) {
echo $title;
}
Chunking Results
Wenn Sie mit Tausenden von Datenbankeinträgen arbeiten müssen, sollten Sie die Chunk-Methode verwenden. Diese Methode ruft jeweils einen kleinen Teil der Ergebnisse ab und führt jeden Teil in einen closure zur Verarbeitung ein. Diese Methode ist sehr nützlich, um Artisan-Befehle zu schreiben, die Tausende von Datensätzen verarbeiten. Lassen Sie uns zum Beispiel mit der gesamten users-Tabelle in Teilen von 100 Datensätzen gleichzeitig arbeiten:
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
foreach ($users as $user) {
//
}
});
Sie können verhindern, dass weitere Chunks verarbeitet werden, indem Sie false aus dem Closure zurückgeben:
DB::table('users')->orderBy('id')->chunk(100, function ($users) {
// Process the records...
return false;
});
Wenn Sie Datenbankeinträge aktualisieren, während Sie Ergebnisse checken, können sich Ihre Chunk-Ergebnisse auf unerwartete Weise ändern. Wenn Sie also Datensätze beim Chunking aktualisieren, ist es immer am besten, stattdessen die Methode chunkById zu verwenden. Diese Methode paginiert die Ergebnisse automatisch basierend auf dem Primärschlüssel des Datensatzes:
DB::table('users')->where('active', false)
->chunkById(100, function ($users) {
foreach ($users as $user) {
DB::table('users')
->where('id', $user->id)
->update(['active' => true]);
}
});
When updating or deleting records inside the chunk callback, any changes to the primary key or foreign keys could affect the chunk query. This could potentially result in records not being included in the chunked results.
Aggregates
Der Query Builder bietet auch eine Vielzahl von Aggregatemethoden wie count, max, min, avg und sum. Sie können jede dieser Methoden nach der Konstruktion Ihrer Query aufrufen:
$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');
Sie können diese Methoden mit anderen Klauseln kombinieren:
$price = DB::table('orders')
->where('finalized', 1)
->avg('price');
Determining If Records Exist
Anstatt die count-Methode zu verwenden, um festzustellen, ob Datensätze existieren, die den Einschränkungen Ihrer Abfrage entsprechen, können Sie die Methoden "exists" und "doesntExist" verwenden:
return DB::table('orders')->where('finalized', 1)->exists();
return DB::table('orders')->where('finalized', 1)->doesntExist();