Datenbanken: Erste Schritte
Einführung
Laravel kann natives SQL, Query Builder und Eloquent ORM nutzen , um ganz einfach in verschiedenen Datenbank-Backends mit der Datenbank zu interagieren. Derzeit unterstützt Laravel vier Datenbanken:
- MySQL
- Postgres
- SQLite
- SQL Server
Aufbau
Die Datenbankkonfigurationsdatei wird in config/database.php
der Datei abgelegt, in der Sie alle Datenbankverbindungen definieren und die zu verwendende Standardverbindung angeben können. Diese Datei enthält Beispiele für die meisten von Laravel unterstützten Datenbankkonfigurationen.
Standardmäßig verwendet die Beispielumgebungskonfiguration von Laravel Laravel Homestead (dies ist eine kleine virtuelle Maschine, mit der Sie Laravel problemlos lokal entwickeln können). Sie können diese Konfiguration entsprechend den Anforderungen Ihrer lokalen Datenbank ändern.
SQLite-Konfiguration
Nachdem Sie mit einem Befehl wie diesem touch database/database.sqlite
eine neue SQLite-Datenbank erstellt haben , können Sie die Umgebungsvariable so konfigurieren, dass sie auf die neu erstellte Datenbank verweist, indem Sie den absoluten Pfad der Datenbank verwenden:
DB_CONNECTION=sqlite
DB_DATABASE=/absolute/path/to/database.sqlite
Lese- und Schreibverbindungen
Manchmal möchten Sie, dass die SELECT-Anweisung eine Datenbankverbindung verwendet und die INSERT-, UPDATE- und DELETE-Anweisungen eine andere Datenbankverbindung. Dies ist in Laravel ein Kinderspiel, egal ob Sie native Abfragen, Abfrage-Builder oder das Eloquent ORM verwenden.
Um zu verstehen, wie die Lese-/Schreibtrennung der Datenbank konfiguriert wird, schauen wir uns dieses Beispiel an:
'mysql' => [
'read' => [
'host' => '192.168.1.1',
],
'write' => [
'host' => '196.168.1.2'
],
'sticky' => true,
'driver' => 'mysql',
'database' => 'database',
'username' => 'root',
'password' => '',
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
],
Beachten Sie, dass im obigen Beispiel drei Schlüssel zum Konfigurationsarray hinzugefügt wurden: read
, write
und sticky
. read
und write
beide enthalten ein host
Array mit key . read
Die anderen write
Datenbankkonfigurationen von und befinden sich im Hauptarray mit dem Schlüssel mysql
:
Wenn Sie ein Konfigurationselement im Hauptarray überschreiben möchten, fügen Sie es einfach in das read
und- write
Array ein. In diesem Beispiel wird also Folgendes 192.168.1.1
als Host für „Lese“-Verbindungen und 192.168.1.2
als Host für „Schreib“-Verbindungen verwendet. Die beiden Verbindungen teilen sich mysql
verschiedene Konfigurationen des Hauptarrays, z. B. Datenbankanmeldeinformationen, Präfix, Zeichenkodierung usw.
sticky
Optionen
sticky
ist ein optionaler Wert, der zum sofortigen Lesen von Datensätzen verwendet werden kann, die während des aktuellen Anforderungszyklus in die Datenbank geschrieben wurden. Wenn sticky
diese Option aktiviert ist und während des aktuellen Anforderungszyklus ein „Schreib“-Vorgang ausgeführt wurde, verwenden alle „Lese“-Vorgänge die „Schreib“-Verbindung. Dadurch wird sichergestellt, dass im selben Zyklus geschriebene Daten sofort im selben Zyklus gelesen werden können. Ob es aktiviert ist oder nicht, hängt von den Anforderungen der Anwendung ab.
Verwenden Sie mehrere Datenbankverbindungen
Wenn Sie mehrere Datenbankverbindungen verwenden, können Sie über DB
die Fassadenmethode connection
auf jede Verbindung zugreifen . Durch die Übergabe name
als connection
Parameter an die Methode können Sie config/database.php
die Verbindung mit dem entsprechenden Namen in der Konfigurationsdatei verwenden:
$users = DB::connection('foo')->select(...);
Sie können auch über Methoden einer verbundenen Instanz auf die zugrunde liegende PDO-Instanz zugreifen getPdo
:
$pdo = DB::connection()->getPdo();
Führen Sie native SQL-Abfragen aus
Nachdem Sie die Datenbankverbindung konfiguriert haben, können Sie DB
die Fassade zum Ausführen von Abfragen verwenden. DB
Die Facade stellt Methoden für jeden Abfragetyp bereit : select
, update
, und .insert
delete
statement
Führen Sie die Select-Abfrage aus
Sie können DB
Facade- select
Methoden verwenden, um grundlegende Abfragen auszuführen:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use App\Http\Controllers\Controller;
class UserController extends Controller
{
/**
* 显示所有应用程序的用户列表
*
* @return Response
*/
public function index()
{
$users = DB::select('select * from users where active = ?', [1]);
return view('user.index', ['users' => $users]);
}
}
Der erste an die Methode übergebene Parameter select
ist eine native SQL-Abfrage und der zweite Parameter ist der Parameterwert, der an die Abfrage gebunden werden muss. Normalerweise werden diese Werte in Einschränkungsanweisungen verwendet where
. Die Parameterbindung wird verwendet, um eine SQL-Injection zu verhindern.
select
Die Methode gibt immer ein Array zurück, jedes Ergebnis im Array ist ein StdClass
Objekt und auf den Ergebniswert kann wie unten beschrieben zugegriffen werden
foreach ($users as $user) {
echo $user->name;
}
Verwenden Sie benannte Bindungen
Zusätzlich zur ?
Darstellung von Parameterbindungen können Sie benannte Bindungen auch zum Ausführen einer Abfrage verwenden:
$results = DB::select('select * from users where id = :id', ['id' => 1]);
Führen Sie die INSERT-Anweisung aus
Sie können DB
Facade- insert
Methoden verwenden, um Anweisungen auszuführen insert
. Wie select
bei verwendet diese Methode die native SQL-Abfrage als ersten Parameter und die gebundenen Daten als zweiten Parameter:
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
Führen Sie die Update-Anweisung aus
update
Die Methode wird verwendet, um vorhandene Datensätze in der Datenbank zu aktualisieren. Diese Methode gibt die Anzahl der von der Anweisung betroffenen Zeilen zurück:
$affected = DB::update('update users set votes = 100 where name = ?', ['John']);
Führen Sie die Löschanweisung aus
delete
Die Methode wird zum Löschen von Datensätzen aus der Datenbank verwendet. Gibt wie update
folgt die Anzahl der von der Anweisung betroffenen Zeilen zurück:
$deleted = DB::delete('delete from users');
Führen Sie gewöhnliche Anweisungen aus
Einige Datenbankanweisungen geben keinen Wert zurück. Für diese Anweisungen können Sie DB
die Facade- statement
Methode verwenden, um Folgendes auszuführen:
DB::statement('drop table users');
Warten Sie auf Abfrageereignisse
Wenn Sie jede von Ihrem Programm ausgeführte SQL-Abfrage überwachen möchten, können Sie listen
die Methode verwenden. Diese Methode eignet sich zum Protokollieren von Abfragen oder zum Debuggen. Sie können Ihren Abfrage-Listener beim Dienstanbieter registrieren:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* 启动应用服务
*
* @return void
*/
public function boot()
{
DB::listen(function ($query) {
// $query->sql
// $query->bindings
// $query->time
});
}
/**
* 注册服务提供器
*
* @return void
*/
public function register()
{
//
}
}
Datenbanktransaktion
Sie können DB
Fassadenmethoden verwenden transaction
, um eine Reihe von Vorgängen innerhalb einer Datenbanktransaktion auszuführen. Wenn Closure
während der Transaktion eine Ausnahme auftritt, wird die Transaktion zurückgesetzt. Bei Closure
erfolgreicher Ausführung wird die Transaktion automatisch festgeschrieben. Sie müssen sich transaction
bei der Verwendung der folgenden Methoden keine Gedanken über ein manuelles Rollback oder Commit machen:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
});
Behandeln Sie Deadlocks
transaction
Die Methode akzeptiert einen optionalen zweiten Parameter, der die Anzahl der Wiederholungsversuche angibt, wenn die Transaktion blockiert. Sobald diese Versuche erschöpft sind, wird eine Ausnahme ausgelöst:
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);
DB::table('posts')->delete();
}, 5);
Transaktionen manuell verwenden
Wenn Sie eine Transaktion manuell starten und die volle Kontrolle über Rollback und Commit haben möchten, können Sie Methoden an der Fassade DB
verwenden :beginTransaction
DB::beginTransaction();
Sie können rollBack
eine Transaktion mit der folgenden Methode zurücksetzen:
DB::rollBack();
Schließlich können Sie commit
die Transaktion mit der folgenden Methode festschreiben:
DB::commit();
{tip}
DB
Die Transaktionsmethoden der Fassade gelten auch für den Abfrage-Builder und Eloquent ORM .