Schnellstart


Datenbank: Erste Schritte

    Einführung
    • Konfiguration
    • Lesen & Verbindung schreiben
    • Mehrere Datenbankverbindungen verwenden
  • Natives SQL ausführen Abfrage
    • Abfrageereignis abhören
  • Datenbanktransaktion

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

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

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.sqlite

Wenn 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 Schreibtrennung

Manchmal 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 implementieren

Um 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

Wenn Sie die Konfiguration im Hauptarray überschreiben möchten, ändern Sie einfach die Arrays

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

Die

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 DBFassade < ü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-Abfrage

Sobald 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. deletestatement

Auswahlabfrage ausführen

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 selectwhere

-Methode gibt immer ein Array zurück, jedes Ergebnis im Array ist ein =

-Objekt, auf den Ergebniswert kann wie folgt zugegriffen werden: select

foreach ($users as $user) { 
   echo $user->name;
 }
StdClass

Verwenden Sie benannte Bindungen

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]);
?

Führen Sie die Einfügeanweisung aus

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']);
insertselect

Führen Sie die Update-Anweisung aus
< Das 🎜>
-Methode wird verwendet, um vorhandene Datensätze in der Datenbank zu aktualisieren. Diese Methode gibt die Anzahl der Zeilen zurück, die von der Anweisung betroffen sind:

$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 statementFacade 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}

Fassadentransaktion Die Methode ist auch auf Query Builder und Eloquent ORM anwendbar.DB

Dieser Artikel wurde erstmals veröffentlicht am
LearnKu.com Website.