Schnellstart
Einführung
Laravel ermöglicht eine sehr einfache Interaktion mit Datenbanken in verschiedenen Datenbank-Backends unter Verwendung von nativem SQL, Fluent Query Builder und Eloquent ORM. Derzeit unterstützt Laravel vier Datenbanken:
- MySQL
- PostgreSQL
- SQLite
- SQL Server
Konfiguration
Die Konfigurationsdatei der Datenbank wird im <🎜 abgelegt > Datei. Hier können Sie alle Datenbankverbindungen definieren und die standardmäßig zu verwendende Verbindung angeben. Diese Datei enthält Beispiele für die meisten von Laravel unterstützten Datenbankkonfigurationen. config/database.php
eine neue SQLite-Datenbank erstellt haben, können Sie die Umgebungsvariable mithilfe des absoluten Pfads der Datenbank konfigurieren, auf die verwiesen werden soll diese neu erstellte Datenbank:touch database/database.sqlite
DB_CONNECTION=sqliteDB_DATABASE=/absolute/path/to/database.sqliteWenn Sie Fremdschlüsseleinschränkungen für SQLite-Verbindungen aktivieren möchten, sollten Sie
ändern Zur foreign_key_constraints
Konfigurationsdatei hinzufügen: config / database.php
'sqlite' => [ // ... 'foreign_key_constraints' => true, ],Lese- und SchreibtrennungManchmal möchten Sie, dass die SELECT-Anweisung dies tut verwenden eine Datenbankverbindung, während INSERT-, UPDATE- und DELETE-Anweisungen eine andere Datenbankverbindung verwenden. Unabhängig davon, ob Sie native Abfragen, Abfrage-Builder oder Eloquent ORM verwenden, können Sie es in Laravel problemlos implementierenUm zu verstehen, wie die Lese-/Schreibtrennung konfiguriert ist, schauen wir uns zunächst ein 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, nämlich
, read
und write
. Die Schlüssel für sticky
und read
enthalten beide ein Array mit dem Schlüssel write
. Und die anderen Datenbanken für host
und read
befinden sich im Array mit dem Schlüssel write
. mysql
und read
. In diesem Beispiel stellt also write
eine Verbindung zum Host als „Lesen“ her und 192.168.1.1
stellt eine Verbindung zum Host als „Schreiben“ her. Diese beiden Verbindungen teilen sich verschiedene Konfigurationen des 192.168.1.2
-Arrays, wie z. B. Datenbankanmeldeinformationen (Benutzername/Passwort), Präfix, Zeichenkodierung usw. mysql
sticky
-Option
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 die Option sticky
aktiviert ist und während des aktuellen Anforderungszyklus ein „Schreib“-Vorgang durchgeführt wurde, verwenden alle „Lese“-Vorgänge die „Schreib“-Verbindung. Dadurch wird sichergestellt, dass im selben Anforderungszyklus geschriebene Daten sofort gelesen werden können, wodurch das Problem der Dateninkonsistenz durch Master-Slave-Verzögerung vermieden wird. Ob es jedoch aktiviert werden soll, hängt von den Anforderungen der Anwendung ab.
Verwendung mehrerer Datenbankverbindungen
Bei Verwendung mehrerer Datenbankverbindungen können Sie die DB
Fassade < übergeben 🎜> Methode greift auf jede Verbindung zu. Das an die Methode connection
übergebene Argument connection
sollte ein Wert aus dem Verbindungsarray in der Konfigurationsdatei name
sein: config/database.php
$users = DB::connection('foo')->select(...);Sie können auch mit der Methode
auf a auf das zugrunde liegende PDO zugreifen Verbindungsinstanz Beispiel: getPdo
$pdo = DB::connection()->getPdo();Ausführen einer nativen SQL-AbfrageSobald die Datenbankverbindung konfiguriert ist, können Sie<🎜 verwenden > Fassade führt die Abfrage aus. Die
-Fassade stellt Methoden für jeden Abfragetyp bereit: DB
, DB
, select
, update
und insert
. delete
statement
Sie können die
-Methode von Facade verwenden, um die grundlegende Abfrageanweisung auszuführen: DB
<?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]); } }
select
wird an übergeben Der erste Parameter der Methode ist ein natives SQL Abfrage, und der zweite Parameter ist der Parameterwert, der an die Abfrage gebunden werden muss. Normalerweise werden diese Werte in Einschränkungsanweisungen verwendet. Die Parameterbindung wird verwendet, um eine SQL-Injection zu verhindern. Die select
where
-Objekt, auf den Ergebniswert kann wie folgt zugegriffen werden: select
foreach ($users as $user) { echo $user->name; }
StdClass
zusätzlich zur Verwendung von
Zusätzlich zur Angabe der Parameterbindung können Sie auch eine benannte Bindung verwenden, um eine Abfrage auszuführen:$results = DB::select('select * from users where id = :id', ['id' => 1]);
?
Sie können die
Fassade < verwenden 🎜> Methode zum Ausführen der-Anweisung. Wie DB
verwendet diese Methode die native SQL-Abfrage als ersten Parameter und die gebundenen Daten als zweiten Parameter: insert
DB::insert('insert into users (id, name) values (?, ?)', [1, 'Dayle']);
insert
select
Führen Sie die Update-Anweisung aus $affected = DB::update('update users set votes = 100 where name = ?', ['John']);
Die Methode
Run Delete Statement
delete
wird zum Löschen von Datensätzen aus der Datenbank verwendet. Gibt wie update
die Anzahl der von der Anweisung betroffenen Zeilen zurück:
$deleted = DB::delete('delete from users');
Ausführen einer normalen Anweisung
Einige Datenbankanweisungen geben keinen Wert zurück. Für diese Anweisungen können Sie die DB
-Methode von statement
Facade verwenden, um Folgendes auszuführen:
DB::statement('drop table users');
Listen for query events
Wenn Sie jede vom Programm ausgeführte SQL-Abfrage überwachen möchten, können Sie listen
verwenden Methode. 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 das <🎜 verwenden > Die DB
-Methode der Fassade führt eine Reihe von Vorgängen innerhalb einer Datenbanktransaktion aus. Wenn beim Abschluss der Transaktion transaction
eine Ausnahme auftritt, wird die Transaktion zurückgesetzt. Wenn der Transaktionsabschluss Closure
erfolgreich ausgeführt wird, wird die Transaktion automatisch festgeschrieben. Sobald Sie Closure
verwenden, müssen Sie sich nicht mehr um manuelles Rollback oder Commit kümmern: transaction
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); });Deadlock-Behandlung
Methode akzeptiert einen akzeptablen zweiten Parameter Mit „selected“ wird angegeben, wie oft die Transaktion wiederholt wird, wenn ein Deadlock auftritt. Sobald die definierte Anzahl an Versuchen abgeschlossen ist, wird eine Ausnahme ausgelöst: transaction
DB::transaction(function () { DB::table('users')->update(['votes' => 1]); DB::table('posts')->delete(); }, 5);Transaktionen manuell verwenden Wenn Sie eine Transaktion manuell starten möchten und Bedenken haben Über Rollback und Submission können Sie die Methode
Facade DB
vollständig steuern: beginTransaction
DB::beginTransaction();
-Methode zum Zurücksetzen der Transaktion: rollBack
DB::rollBack();Schließlich können Sie die
-Methode verwenden, um die Transaktion festzuschreiben: commit
DB::commit();
{tip}Dieser Artikel wurde erstmals veröffentlicht amFassadentransaktion Die Methode ist auch auf Query Builder und Eloquent ORM anwendbar.
DB