Abfrage-Builder


Datenbank: Abfrage-Generator

  • Einführung
  • Ergebnisse erhalten
    • Blockierte Ergebnisse
    • Aggregation
  • Abfrage
  • Native Ausdrücke
  • Verknüpfungen
  • Unions
  • Wo Anweisung
    • Parametergruppierung
    • Where Exists Syntax
    • JSON Where Syntax
  • Reihenfolge, Gruppierung, Begrenzung & Offset
  • Bedingte Anweisung
  • Einfügen
  • Update
    • Update JSON
    • Inkrementieren und Dekrementieren
  • Löschen
  • Pessimistische Sperre

Einführung

Der Datenbankabfrage-Builder von Laravel bietet eine praktische Schnittstelle zum Erstellen und Ausführen von Datenbankabfragen. Es kann für die Ausführung der meisten Datenbankoperationen in einer Anwendung verwendet werden und läuft auf allen unterstützten Datenbanksystemen.

Der Abfrage-Builder von Laravel verwendet PDO-Parameterbindung, um Ihre Anwendung vor SQL-Injection-Angriffen zu schützen. Es besteht also keine Notwendigkeit, die als Bindung übergebene Zeichenfolge zu bereinigen.

Ergebnisse abrufen

Alle Zeilen aus einer Datentabelle abrufen

Sie können DB auf facade table verwenden Methode zum Starten der Abfrage. Die table-Methode gibt eine Abfrage-Builder-Instanz für die angegebene Tabelle zurück, sodass Sie weitere Einschränkungen für die Abfrage verketten und schließlich die get-Methode verwenden können, um das Ergebnis zu erhalten:

<?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::table('users')->get();        
        return view('user.index', ['users' => $users]);    
       }
   }

theget The Die Methode gibt ein Ergebnis zurück, das IlluminateSupportCollection enthält, wobei jedes Ergebnis eine Instanz des PHP StdClass-Objekts ist. Sie können auf die Felder als Eigenschaften des Objekts zugreifen, um auf die Werte jeder Spalte zuzugreifen:

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

Eine einzelne Zeile oder Spalte aus der Datentabelle abrufen

if Sie müssen lediglich eine einzelne Zeile oder Spalte aus der Datentabelle abrufen. Um eine Datenzeile zu erhalten, können Sie die Methode first verwenden. Diese Methode gibt ein StdClass-Objekt zurück:

$user = DB::table('users')->where('name', 'John')->first();
echo $user->name;

Wenn Sie nicht einmal die gesamte Datenzeile benötigen, können Sie die Methode value verwenden, um einen einzelnen Wert aus dem Datensatz abzurufen. Diese Methode gibt direkt den Wert des Feldes zurück:

$email = DB::table('users')->where('name', 'John')->value('email');

Den Wert einer Spalte abrufen

Wenn Sie eine Sammlung erhalten möchten, die einen einzelnen Spaltenwert enthält, können Sie Folgendes tun kann die Methode pluck verwenden. Im folgenden Beispiel erhalten wir eine Sammlung von Titeln in der Rollentabelle:

$titles = DB::table('roles')->pluck('title');
foreach ($titles as $title) { 
   echo $title;
 }

Sie können auch benutzerdefinierte Schlüsselwerte für Felder in der zurückgegebenen Sammlung angeben:

$roles = DB::table('roles')->pluck('title', 'name');
foreach ($roles as $name => $title) {  
  echo $title;
 }

Geteilte Ergebnisse

Wenn Sie Tausende von Datenbankeinträgen verarbeiten müssen, können Sie die Verwendung der chunk-Methode in Betracht ziehen. Diese Methode nimmt jeweils einen kleinen Teil des Ergebnissatzes und übergibt ihn zur Verarbeitung an die Funktion 闭包. Diese Methode ist nützlich, wenn Sie Artisan-Befehle schreiben, um Tausende von Daten zu verarbeiten. Beispielsweise können wir die gesamten users-Tabellendaten in kleine Blöcke schneiden, die jeweils 100 Datensätze verarbeiten:

DB::table('users')->orderBy('id')->chunk(100, function ($users) { 
   foreach ($users as $user) {     
      //   
     }
 });

Sie können die weitere Erfassung von Chunk-Ergebnissen beenden, indem Sie 闭包 in false zurückgeben:

DB::table('users')->orderBy('id')->chunk(100, function ($users) {   
 // Process the records...    
 return false;
});

Wenn Sie den Datenbankeintrag beim Aufteilen der Ergebnisse aktualisieren möchten, stimmen die aufgeschlüsselten Ergebnisse möglicherweise nicht mit den erwarteten Rückgabeergebnissen überein. Daher ist es beim Aktualisieren von Datensätzen in Blöcken am besten, 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]);      
         }  
   });

{Tipp} Beim Aktualisieren oder Löschen von Datensätzen innerhalb des Rückrufs eines Blocks können sich alle Änderungen am Primär- oder Fremdschlüssel auf die Blockabfrage auswirken . . Dies kann dazu führen, dass Datensätze nicht in die aufgeteilten Ergebnisse einbezogen werden.

Aggregation

Der Abfrage-Builder bietet auch verschiedene Aggregationsmethoden, wie z. B. count, max, min, avg und sum. Sie können nach dem Erstellen der Abfrage jede beliebige Methode aufrufen:

$users = DB::table('users')->count();
$price = DB::table('orders')->max('price');

Natürlich können Sie diese Aggregationsmethoden auch mit anderen Abfrageanweisungen kombinieren:

$price = DB::table('orders')             
   ->where('finalized', 1)                
   ->avg('price');

Bestimmen Sie, ob der Datensatz vorhanden ist

Zusätzlich zur Verwendung der Methode count zur Bestimmung, ob das Ergebnis der Abfragebedingung vorhanden ist, können Sie auch exists und verwenden doesntExistMethode:

return DB::table('orders')->where('finalized', 1)->exists();
return DB::table('orders')->where('finalized', 1)->doesntExist();

Selects

Geben Sie eine Select-Anweisung an

Natürlich möchten Sie möglicherweise nicht immer alle Spalten aus einer Datenbanktabelle abrufen. Mit der select-Methode können Sie eine select-Abfrageanweisung anpassen, um das angegebene Feld abzufragen:

$users = DB::table('users')->select('name', 'email as user_email')->get();

distinct Die Methode erzwingt, dass die von der Abfrage zurückgegebenen Ergebnisse nicht doppelt vorhanden sind:

$users = DB::table('users')->distinct()->get();

Wenn Sie bereits über eine Abfrage-Builder-Instanz verfügen und der vorhandenen Abfrage ein Feld hinzufügen möchten, können Sie addSelect verwenden Methode:

$query = DB::table('users')->select('name');
$users = $query->addSelect('age')->get();

Nativer Ausdruck

Manchmal müssen Sie möglicherweise einen nativen Ausdruck in einer Abfrage verwenden. Sie können einen nativen Ausdruck mit DB::raw erstellen:

$users = DB::table('users')               
      ->select(DB::raw('count(*) as user_count, status'))                     
      ->where('status', '<>', 1)                     
      ->groupBy('status')                    
       ->get();

{TIP} Ein nativer Ausdruck wird als Zeichenfolge in die Abfrage eingefügt. Sie sollten ihn daher mit Vorsicht verwenden, um die Entstehung von SQL-Injection-Lücken zu vermeiden .

Native Methoden

Sie können anstelle von DB::raw die folgende Methode verwenden, um native Ausdrücke einzufügen in die Abfrage verschiedene Teile von.

Anstelle von

kann auch die Methode selectRaw

selectRawselect(DB::raw(...)) verwendet werden. Der zweite Parameter dieser Methode ist optional und der Wert ist ein Array gebundener Parameter:

$orders = DB::table('orders')            
    ->selectRaw('price * ? as price_with_tax', [1.0825])                
    ->get();

whereRaw / orWhereRaw

whereRaw und orWhereRaw Methoden Inject native where
in Ihre Abfrage ein. Der zweite Parameter dieser beiden Methoden ist immer noch optional und der Wert ist immer noch ein Array gebundener Parameter:

$orders = DB::table('orders')          
      ->whereRaw('price > IF(state = "TX", ?, 100)', [200])                
      ->get();

havingRaw / orHavingRaw

havingRaw und orHavingRaw Methode kann verwendet werden, um die native Zeichenfolge auf having festzulegen Wert der Anweisung: Die Methode

$orders = DB::table('orders')         
       ->select('department', DB::raw('SUM(price) as total_sales'))                
       ->groupBy('department')                
       ->havingRaw('SUM(price) > ?', [2500])                
       ->get();

orderByRaw

orderByRaw kann verwendet werden, um die native Zeichenfolge auf order by festzulegen Werte der Klauseln:

$orders = DB::table('orders')            
    ->orderByRaw('updated_at - created_at DESC')                
    ->get();

Joins

Inner Join Clause

Abfrageersteller können auch join Methoden schreiben. Um eine grundlegende
„interne Verlinkung“ durchzuführen, können Sie die join-Methode auf der Abfrage-Builder-Instanz verwenden. Der erste an die join-Methode übergebene Parameter ist der Name der Tabelle, die Sie verknüpfen müssen, während die anderen Parameter Feldeinschränkungen verwenden, die den Join angeben. Sie können auch mehrere Datentabellen in einer einzigen Abfrage verknüpfen:

$users = DB::table('users')         
   ->join('contacts', 'users.id', '=', 'contacts.user_id')            
   ->join('orders', 'users.id', '=', 'orders.user_id')            
   ->select('users.*', 'contacts.phone', 'orders.price')            
   ->get();

Left-Join-Anweisung

Wenn Sie stattdessen „Left-Join“ oder „Right-Join“ verwenden möchten " „Inner Join“, Sie können die Methode leftJoin oder rightJoin verwenden. Diese beiden Methoden haben die gleiche Verwendung wie die join-Methode:

$users = DB::table('users')  
       ->leftJoin('posts', 'users.id', '=', 'posts.user_id')            
       ->get();     $users = DB::table('users')            
       ->rightJoin('posts', 'users.id', '=', 'posts.user_id')            
       ->get();

Cross-Join-Anweisung

Verwenden Sie die crossJoin-Methode, um „Cross“ mit der Tabelle durchzuführen Geben Sie den Namen ein, dem Sie beitreten möchten. Ein Cross-Join erzeugt ein kartesisches Produkt zwischen der ersten Tabelle und der verbundenen Tabelle:

$users = DB::table('sizes')         
   ->crossJoin('colours')            
   ->get();

Erweiterte Join-Anweisung

Sie können erweiterte Join-Anweisungen angeben. Übergeben Sie beispielsweise einen 闭包 als zweiten Parameter der join-Methode. Dieses 闭包 akzeptiert ein
JoinClause-Objekt und gibt damit die in der join-Anweisung angegebenen Einschränkungen an:

DB::table('users')    
    ->join('contacts', function ($join) {         
       $join->on('users.id', '=', 'contacts.user_id')->orOn(...);    
         })        
    ->get();

Wenn Sie „where“-Stilanweisungen für die Verbindung verwenden möchten, können Sie Folgendes verwenden: die Methoden where und orWhere für Verbindungen. Diese Methoden vergleichen Spalten mit Werten statt Spalten mit Spalten:

DB::table('users')     
   ->join('contacts', function ($join) {           
    $join->on('users.id', '=', 'contacts.user_id')               
   ->where('contacts.user_id', '>', 5);     
    })       
   ->get();

Subjoin-Abfrage

Sie können die Methoden joinSub, leftJoinSub und rightJoinSub verwenden Ordnen Sie eine Abfrage als Unterabfrage zu. Jede ihrer Methoden erhält drei Parameter: eine Unterabfrage, einen Tabellenalias und einen Abschluss, der das zugehörige Feld definiert:

$latestPosts = DB::table('posts')         
        ->select('user_id', DB::raw('MAX(created_at) as last_post_created_at'))                   
        ->where('is_published', true)                   
        ->groupBy('user_id');$users = DB::table('users')        
        ->joinSub($latestPosts, 'latest_posts', function($join) {          
             $join->on('users.id', '=', 'latest_posts.user_id');     
           })
        ->get();

Vereinigungen

Der Abfrage-Generator bietet auch eine Verknüpfung zum „Vereinigung“ zweier Abfragen. Sie können beispielsweise zuerst eine Abfrage erstellen und diese dann mit der Methode union mit einer zweiten Abfrage verbinden:

$first = DB::table('users')         
   ->whereNull('first_name');$users = DB::table('users')            
   ->whereNull('last_name')            
   ->union($first)            
   ->get();

{Tipp} Sie können auch die Methode unionAll verwenden, indem Sie <🎜 verwenden > Die Methode ist die gleiche. union

Where-Anweisung

Einfache Where-Anweisung

Beim Erstellen einer

-Abfrageinstanz können Sie Folgendes verwenden where Methode. Die einfachste Art, where aufzurufen, besteht darin, drei Parameter zu übergeben: Der erste Parameter ist der Spaltenname, der zweite Parameter ist ein beliebiger vom Datenbanksystem unterstützter Operator und der dritte Parameter ist der Wert der zu vergleichenden Spalte. where

Hier ist zum Beispiel eine Abfrage, um zu überprüfen, ob der Wert des Felds „Stimmen“ gleich 100 ist:

$users = DB::table('users')->where('votes', '=', 100)->get();

Der Einfachheit halber, wenn Sie einfach vergleichen, ob der Spaltenwert gleich ist Auf einen bestimmten Wert können Sie den Wert direkt als zweiten Parameter der

-Methode verwenden: where

$users = DB::table('users')->where('votes', 100)->get();

Natürlich können Sie zum Schreiben auch andere Operatoren verwenden

-Klausel: where

$users = DB::table('users')           
     ->where('votes', '>=', 100)                
     ->get();$users = DB::table('users')                
     ->where('votes', '<>', 100)                
     ->get();$users = DB::table('users')                
     ->where('name', 'like', 'T%')                
     ->get();

Sie können das bedingte Array auch an die

-Funktion übergeben: where

$users = DB::table('users')->where([
    ['status', '=', '1'],   
     ['subscribed', '<>', '1'],
  ])->get();

Oder Anweisung

Sie können To Bei Chain-Where-Einschränkungen können Sie der Abfrage auch

-Wörter hinzufügen. Die or-Methode erhält die gleichen Parameter wie die orWhere-Methode: where

$users = DB::table('users')         
      ->where('votes', '>', 100)                    
      ->orWhere('name', 'John')                    
      ->get();

Andere Where-Anweisungen

whereBetween

whereBetween Die Methode überprüft, ob der Feldwert zwischen den beiden angegebenen Werten liegt:

$users = DB::table('users')                 
   ->whereBetween('votes', [1, 100])->get();

whereNotBetween

whereNotBetween Die Methode überprüft, ob der Feldwert zwischen den beiden angegebenen Werten liegt Draußen:

$users = DB::table('users')          
       ->whereNotBetween('votes', [1, 100])                    
       ->get();

whereIn / whereNotIn

whereIn Der Wert des Methodenüberprüfungsfelds muss im angegebenen Array vorhanden sein, :

$users = DB::table('users')     
      ->whereIn('id', [1, 2, 3])                    
      ->get();

whereNotIn Der Wert des Methodenüberprüfungsfelds darf nicht im angegebenen Array vorhanden sein angegebenes Array:

$users = DB::table('users')                 
   ->whereNotIn('id', [1, 2, 3])                    
   ->get();

whereNull / whereNotNull

whereNull Das durch die Methodenüberprüfung angegebene Feld muss NULL sein:

$users = DB::table('users')                 
   ->whereNull('updated_at')                    
   ->get();

whereNotNull Das durch die Methodenüberprüfung angegebene Feld darf nicht NULL sein:

        $users = DB::table('users')               
             ->whereNotNull('updated_at')                    
             ->get();

whereDate / whereMonth / whereDay / whereYear / whereTime

whereDate-Methode wird verwendet, um den Feldwert mit dem angegebenen Datum zu vergleichen:

        $users = DB::table('users')           
             ->whereDate('created_at', '2018-09-08')                
             ->get();

whereMonth-Methode wird verwendet, um den Feldwert mit dem angegebenen Monat des zu vergleichen Jahr:

$users = DB::table('users')          
      ->whereMonth('created_at', '9')                
      ->get();

whereDay Die Methode wird verwendet, um den Feldwert mit dem angegebenen Tag im Januar zu vergleichen:

  $users = DB::table('users')           
       ->whereDay('created_at', '8')                
       ->get();

whereYear Die Methode wird verwendet, um den Feldwert mit dem angegebenen Jahr zu vergleichen:

$users = DB::table('users')           
     ->whereYear('created_at', '2018')                
     ->get();

whereTime Die Methode wird verwendet, um den Feldwert mit der angegebenen Zeit (Stunden, Minuten und Sekunden) zu vergleichen:

     $users = DB::table('users')              
       ->whereTime('created_at', '=', '11:20:45')                
       ->get();

whereColumn

whereColumn Die Methode wird zum Vergleichen verwendet die Werte zweier Felder Gleichheit:

        $users = DB::table('users')             
           ->whereColumn('first_name', 'last_name')                
           ->get();

Sie können auch einen Vergleichsoperator übergeben:

$users = DB::table('users')             
   ->whereColumn('updated_at', '>', 'created_at')                
   ->get();

whereColumn Sie können auch ein Array mit and übergeben Operatorverkettung:

$users = DB::table('users')             
   ->whereColumn([                
       ['first_name', '=', 'last_name'],                    
       ['updated_at', '>', 'created_at']              
  ])->get();

Parametergruppierung

Manchmal müssen Sie erweiterte Where-Klauseln erstellen, z. B. „where is“. " oder verschachtelte Parametergruppierung. Auch der Abfrage-Builder von Laravel kann damit umgehen. Schauen wir uns als Nächstes ein Beispiel für Gruppierungsbeschränkungen in Klammern an:

DB::table('users')        
    ->where('name', '=', 'John')            
    ->where(function ($query) {               
     $query->where('votes', '>', 100)                   
        ->orWhere('title', '=', 'Admin');           
     })          
   ->get();

Sie können sehen, dass ein Abfrage-Generator erstellt wird, indem ein Closure in die where-Methode geschrieben wird, um eine Gruppierung einzuschränken. Dieses Closure empfängt eine Abfrageinstanz, mit der Sie die Einschränkungen festlegen können, die einbezogen werden sollen. Das obige Beispiel generiert das folgende SQL:

select * from users where name = 'John' and (votes > 100 or title = 'Admin')

{Tipp} Sie sollten orWhere verwenden, um diese Gruppe aufzurufen, um eine versehentliche Anwendung globaler Effekte zu vermeiden.

Wo existiert Mit der Anweisungsmethode

whereExists können Sie where exists SQL-Anweisungen verwenden. Die whereExists-Methode akzeptiert einen Closure-Parameter. Die whereExists-Methode akzeptiert einen Abschlussparameter. Dieser Abschluss erhält eine Abfrage-Builder-Instanz, mit der Sie Abfragen definieren können, die in exists-Klauseln platziert sind:

DB::table('users')         
   ->whereExists(function ($query) {             
      $query->select(DB::raw(1))                    
        ->from('orders')                      
        ->whereRaw('orders.user_id = users.id');          
    })            
    ->get();

Das Obige Die Abfrage erzeugt das folgende SQL Satz:

select * from users
where exists (
    select 1 from orders where orders.user_id = users.id)

JSON-Where-Anweisung

Laravel unterstützt auch die Abfrage von Feldern vom Typ JSON (nur bei Datenbanken, die den Typ JSON unterstützen). Derzeit unterstützt diese Funktion nur MySQL 5.7, PostgreSQL, SQL Server 2016 und SQLite 3.9.0 (mit der JSON1-Erweiterung). Verwenden Sie den ->-Operator, um JSON-Daten abzufragen:

$users = DB::table('users')            
    ->where('options->language', 'en')                
    ->get();$users = DB::table('users')                
    ->where('preferences->dining->meal', 'salad')                
    ->get();

Sie können auch whereJsonContains verwenden, um JSON-Arrays abzufragen:

$users = DB::table('users')          
      ->whereJsonContains('options->languages', 'en')                
      ->get();

MySQL und PostgreSQLs whereJsonContains können mehrere Werte unterstützen:

$users = DB::table('users')           
     ->whereJsonContains('options->languages', ['en', 'de'])                
     ->get();

Sie können whereJsonLength verwenden, um JSON abzufragen Die Länge des Arrays:

$users = DB::table('users')          
      ->whereJsonLength('options->languages', 0)                
      ->get();$users = DB::table('users')                
      ->whereJsonLength('options->languages', '>', 1)                
      ->get();

Reihenfolge, Gruppierung, Begrenzung und Versatz

orderBy

orderBy Mit der Methode können Sie die Ergebnismenge nach einem bestimmten Feld sortieren. Der erste Parameter von orderBy sollte das Feld sein, das Sie sortieren möchten, und der zweite Parameter steuert die Sortierrichtung, die asc oder desc sein kann:

$users = DB::table('users')           
     ->orderBy('name', 'desc')                
     ->get();

Mit den Methoden „Neueste/Älteste“

latest und oldest können Sie ganz einfach nach Datum sortieren. Standardmäßig wird die Spalte created_at als Sortierung verwendet. Natürlich können Sie auch benutzerdefinierte Spaltennamen übergeben: Die Methode

$user = DB::table('users')              
  ->latest()                
  ->first();

inRandomOrder

inRandomOrder wird verwendet, um die Ergebnisse zufällig anzuordnen. Mit dieser Methode können Sie beispielsweise einen zufälligen Benutzer finden.

$randomUser = DB::table('users')          
      ->inRandomOrder()                
      ->first();

groupBy / getting

groupBy und having Methoden können die Ergebnisse gruppieren. Die Verwendung der having-Methode ist der where-Methode sehr ähnlich:

$users = DB::table('users')             
   ->groupBy('account_id')                
   ->having('account_id', '>', 100)                
   ->get();

Sie können mehrere Parameter an die groupBy-Methode übergeben:

$users = DB::table('users')             
   ->groupBy('first_name', 'status')                
   ->having('account_id', '>', 100)                
   ->get();

Für fortgeschrittenere having Syntax, siehe Methode havingRaw.

Überspringen/Übernehmen

Um die Anzahl der zurückgegebenen Ergebnisse zu begrenzen oder eine bestimmte Anzahl von Ergebnissen zu überspringen, können Sie die Methoden skip und take verwenden :

$users = DB::table('users')->skip(10)->take(5)->get();

Oder Sie können limit und offset verwenden Methode:

$users = DB::table('users')             
   ->offset(10)                
   ->limit(5)                
   ->get();

Bedingte Anweisungen

Manchmal möchten Sie vielleicht, dass eine Klausel eine Abfrage nur ausführt, wenn eine bestimmte Bedingung wahr ist. Beispielsweise können Sie eine where-Anweisung nur anwenden, wenn ein bestimmter Wert in der Anfrage vorhanden ist. Sie können dies tun, indem Sie die Methode when verwenden:

$role = $request->input('role');$users = DB::table('users')             
   ->when($role, function ($query, $role) {              
         return $query->where('role_id', $role);             
        })                
    ->get();

when Die Methode führt den angegebenen Abschluss nur aus, wenn der erste Parameter true ist. Wenn der erste Parameter false ist, wird dieser Abschluss nicht ausgeführt

Sie können einen anderen Abschluss als dritten Parameter der Methode when übergeben. Dieser Abschluss wird ausgeführt, wenn der erste Parameter false ist. Um zu veranschaulichen, wie diese Funktion verwendet wird, konfigurieren wir die Standardreihenfolge für eine Abfrage:

$sortBy = null;$users = DB::table('users')         
       ->when($sortBy, function ($query, $sortBy) {                
           return $query->orderBy($sortBy);               
          }, function ($query) {             
          return $query->orderBy('name');         
         })               
       ->get();

Einfügen

Abfrage Aufbau Der Prozessor stellt auch die Methode insert zum Einfügen von Datensätzen in die Datenbank bereit. Die insert-Methode empfängt Feldnamen und Feldwerte in Form von Arrays für Einfügevorgänge:

DB::table('users')->insert(    ['email' => 'john@example.com', 'votes' => 0]);

Sie können sogar ein Array an die insert-Methode übergeben, um mehrere Datensätze in die Tabelle <🎜 einzufügen >

DB::table('users')->insert([
    ['email' => 'taylor@example.com', 'votes' => 0],    
    ['email' => 'dayle@example.com', 'votes' => 0]
  ]);

Auto-Inkrement-ID

Wenn die Datentabelle eine Auto-Inkrement-ID hat, verwenden Sie

-Methode zum Einfügen eines Datensatzes und Zurückgeben des ID-Werts insertGetId

$id = DB::table('users')->insertGetId(
    ['email' => 'john@example.com', 'votes' => 0]
  );

{Hinweis} Bei Verwendung von PostgreSQL verwendet die

-Methode standardmäßig insertGetId als Namen des Felds für die automatische Inkrementierung . Wenn Sie die ID aus einer anderen „Sequenz“ erhalten möchten, können Sie den Feldnamen als zweiten Parameter an die Methode id übergeben. insertGetId

Aktualisieren

Natürlich kann der Abfrage-Generator nicht nur Datensätze in die Datenbank einfügen übergeben Sie auch die Methode

, um vorhandene Datensätze zu aktualisieren. Die Methode update akzeptiert wie die Methode update ein Array mit den zu aktualisierenden Feldern und Werten. Sie können insert-Abfragen über die where-Klausel einschränken: update

DB::table('users')         
   ->where('id', 1)            
   ->update(['votes' => 1]);

Aktualisieren oder hinzufügen

Manchmal möchten Sie möglicherweise vorhandene Datensätze in der Datenbank aktualisieren oder erstellen den passenden Datensatz, falls dieser nicht vorhanden ist. In diesem Fall kann die Methode

verwendet werden. Die updateOrInsert-Methode akzeptiert zwei Parameter: ein Array von Bedingungen, die zum Suchen des Datensatzes verwendet werden, und ein Array von Schlüssel-Wert-Paaren, die den zu aktualisierenden Datensatz enthalten. Die Methode updateOrInsert

versucht zunächst, mithilfe des Schlüssel-Wert-Paares des ersten Parameters einen passenden Datenbankeintrag zu finden. Wenn der Datensatz vorhanden ist, verwenden Sie den Wert im zweiten Parameter, um den Datensatz zu aktualisieren. Wenn der Datensatz nicht gefunden wird, wird ein neuer Datensatz eingefügt und die aktualisierten Daten sind eine Sammlung aus zwei Arrays: updateOrInsert

DB::table('users')  
  ->updateOrInsert(      
    ['email' => 'john@example.com', 'name' => 'John'],        
    ['votes' => '2']   
  );

JSON-Feld aktualisieren

Beim Aktualisieren eines JSON-Felds können Sie die ->-Syntax verwenden, um auf den entsprechenden Wert im JSON-Objekt zuzugreifen. Dieser Vorgang unterstützt nur MySQL 5.7 :

DB::table('users')       
     ->where('id', 1)            
     ->update(['options->enabled' => true]);

Inkrementieren und Dekrementieren

Der Abfrage-Builder erhöht oder dekrementiert auch ein bestimmtes Feld. Dekrement bietet eine bequeme Methode. Diese Methode bietet eine ausdrucksstärkere und prägnantere Benutzeroberfläche als das manuelle Schreiben von update-Anweisungen.

Beide Methoden erhalten mindestens einen Parameter: die Spalte, die geändert werden muss. Der zweite Parameter ist optional und steuert den Betrag, um den die Spalte erhöht oder verringert wird:

DB::table('users')->increment('votes');
DB::table('users')->increment('votes', 5);
DB::table('users')->decrement('votes');
DB::table('users')->decrement('votes', 5);

Sie können auch die Felder angeben, die während des Vorgangs aktualisiert werden sollen:

DB::table('users')->increment('votes', 1, ['name' => 'John']);

Entfernen

Der Abfrage-Builder kann ebenfalls verwendet werden Die delete-Methode löscht Datensätze aus der Tabelle. Bevor Sie delete verwenden, können Sie eine where-Klausel hinzufügen, um delete einzuschränken. Syntax:

DB::table('users')->delete();
DB::table('users')->where('votes', '>', 100)->delete();

Wenn Sie die Tabelle leeren müssen, können Sie die Methode truncate verwenden, die alle Zeilen löscht und wiederholen Sie „Auto-Inkrement-ID festlegen“. ist Null:

DB::table('users')->truncate();

Pessimistische Sperre

Der Abfrage-Builder enthält auch Hilfe zur select-Syntaxfunktion das implementiert „pessimistisches Sperren“. Wenn Sie eine „gemeinsame Sperre“ in einer Abfrage implementieren möchten, können Sie die Methode sharedLock verwenden. Gemeinsame Sperren verhindern, dass ausgewählte Datenspalten manipuliert werden, bis die Transaktion festgeschrieben wird:

DB::table('users')->where('votes', '>', 100)->sharedLock()->get();

Alternativ können Sie die Methode lockForUpdate verwenden. Verwenden Sie die „Update“-Sperre, um zu verhindern, dass Zeilen durch andere gemeinsame Sperren geändert oder ausgewählt werden:

DB::table('users')->where('votes', '>', 100)->lockForUpdate()->get();
Dieser Artikel wurde zuerst auf der Website LearnKu.com veröffentlicht.