Schnellstart


Eloquent: Erste Schritte

Einführung

Laravel Das Eloquent ORM bietet eine schöne, prägnante ActiveRecord-Implementierung für die Interaktion mit Datenbanken. Jede Datenbanktabelle verfügt über ein entsprechendes „Modell“, das für die Interaktion mit der Tabelle verwendet wird. Sie können Daten in der Datentabelle über das Modell abfragen und neue Datensätze in die Datentabelle einfügen.

Bevor Sie beginnen, stellen Sie sicher, dass Sie die Datenbankverbindung in config/database.php konfigurieren. Weitere Informationen zur Datenbankkonfiguration finden Sie in der Dokumentation.

Modelldefinition

Erstellen Sie zunächst ein eloquentes Modell. Modelle befinden sich normalerweise im Verzeichnis app, Sie können sie jedoch an einer beliebigen Stelle platzieren, wo sie basierend auf der Datei composer.json automatisch geladen werden können. Alle Eloquent-Modelle erben von der Klasse IlluminateDatabaseEloquentModel.

Der einfachste Weg, ein Modell zu erstellen, ist die Verwendung des make:model Artisan-Befehls:

php artisan make:model Flight

Wenn Sie beim Generieren des Modells eine Datenbankmigration generieren möchten, können Sie --migration oder < verwenden 🎜> Optionen: -m

php artisan make:model Flight --migration

php artisan make:model Flight -m

Eloquente Modellkonventionen

Schauen wir uns nun ein Beispiel für ein

-Modell an. Wir werden es ab Flight verwenden Dateninformationen in Datenbanktabellen abrufen und speichern: flights

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Flight extends Model{ 
       //
    }

Name der Datentabelle

Bitte beachten Sie, dass wir Eloquent nicht mitteilen, welche Datentabelle für unser Flight-Modell verwendet werden soll. Sofern nicht explizit ein anderer Name angegeben wird, wird als Tabellenname die Pluralform der Klasse „snakes“ verwendet. Daher geht Eloquent in diesem Fall davon aus, dass das Flight-Modell Daten aus der flights-Datentabelle speichert. Sie können benutzerdefinierte Datentabellen angeben, indem Sie das Attribut table im Modell definieren:

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Flight extends Model{ 
    /**
     * 与模型关联的表名
     *
     * @var string
     */  
   protected $table = 'my_flights';
 }

Primärschlüssel

Eloquent geht außerdem davon aus, dass jede Datentabelle einen Namen hat die Primärschlüsselspalte von id. Sie können ein geschütztes $primaryKey-Attribut definieren, um die Konvention außer Kraft zu setzen.

Darüber hinaus geht Eloquent davon aus, dass der Primärschlüssel ein automatisch inkrementierender Ganzzahlwert ist, was bedeutet, dass der Primärschlüssel standardmäßig automatisch in den Typ int konvertiert wird. Wenn Sie einen nicht aufsteigenden oder nicht numerischen Primärschlüssel verwenden möchten, müssen Sie das öffentliche $incrementing-Attribut auf false setzen. Wenn Ihr Primärschlüssel keine Ganzzahl ist, müssen Sie das geschützte $keyType-Attribut im Modell auf string setzen.

Zeitstempel

Standardmäßig erwartet Eloquent, dass created_at und updated_at in Ihrer Datentabelle vorhanden sind. Wenn Sie nicht möchten, dass Eloquent diese beiden Spalten automatisch verwaltet, setzen Sie bitte das $timestamps-Attribut im Modell auf false:

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Flight extends Model{    
    /**
     * 指示模型是否自动维护时间戳
     *
     * @var bool
     */    
   public $timestamps = false;
  }

Wenn Sie das Zeitstempelformat anpassen müssen, legen Sie < in Ihrem Modell fest 🎜 > Eigenschaften. Dieses Attribut bestimmt, wie das Datumsattribut in der Datenbank gespeichert wird und das Format, in dem das Modell in ein Array oder JSON serialisiert wird: $dateFormat

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Flight extends Model{   
     /**
     * 模型日期列的存储格式。
     *
     * @var string
     */   
     protected $dateFormat = 'U';
    }

Wenn Sie den Feldnamen zum Speichern von Zeitstempeln anpassen müssen, können Sie dies festlegen

und CREATED_AT Zu implementierender konstanter Wert: UPDATED_AT

<?php
    class Flight extends Model{
        const CREATED_AT = 'creation_date';    
        const UPDATED_AT = 'last_update';
     }

Datenbankverbindung

Standardmäßig verwenden Eloquent-Modelle die von Ihrer Anwendung konfigurierte Standarddatenbankverbindung. Wenn Sie eine andere Verbindung für das Modell angeben möchten, legen Sie das Attribut

fest: $connection

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Flight extends Model{   
     /**
     * 模型的连接名称
     *
     * @var string
     */   
     protected $connection = 'connection-name';
   }

Standardattributwert

Wenn Sie Standardwerte für einige Eigenschaften des Modells definieren möchten, können Sie diese im Modell definieren

Attribute: $attributes

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Flight extends Model{  
      /**
     * 模型的默认属性值。
     *
     * @var array
     */  
      protected $attributes = [      
        'delayed' => false,   
         ];
      }

Modellabruf

Nachdem Sie das Modell und die zugehörige Datenbanktabelle erstellt haben, können Sie es daraus abrufen die Datenbank Daten abfragen. Stellen Sie sich jedes Eloquent-Modell als leistungsstarken Abfrage-Builder vor, mit dem Sie die zugehörige Datentabelle schneller abfragen können. Zum Beispiel:

<?php
    $flights = App\Flight::all();
    foreach ($flights as $flight) {   
     echo $flight->name;
    }

Zusätzliche Einschränkungen

Die all-Methode von Eloquent gibt alle Ergebnisse im Modell zurück. Da jedes Eloquent-Modell als Abfrage-Builder fungiert, können Sie auch Abfragebedingungen hinzufügen und dann die Methode get verwenden, um die Abfrageergebnisse zu erhalten:

$flights = App\Flight::where('active', 1)         
      ->orderBy('name', 'desc')               
      ->take(10)               
      ->get();

{tip} Da Eloquent-Modelle auch Abfrage-Builder sind Daher sollten Sie sich auch über alle Methoden informieren, die dem Abfrage-Generator zur Verfügung stehen. Sie können diese Methoden in eloquenten Abfragen verwenden.

Modell neu laden

Sie können das Modell mit den Methoden fresh und refresh neu laden. Die Methode fresh ruft das Modell erneut aus der Datenbank ab. Vorhandene Modellinstanzen sind nicht betroffen: Die Methode

$flight = App\Flight::where('number', 'FR 900')->first();
$freshFlight = $flight->fresh();

refresh weist ein vorhandenes Modell mithilfe neuer Daten aus der Datenbank neu zu. Zusätzlich werden bereits geladene Beziehungen neu geladen:

$flight = App\Flight::where('number', 'FR 900')->first();
$flight->number = 'FR 456';$flight->refresh();
$flight->number;
 // "FR 900"

Collection

für all in Eloquent und get-Methoden können mehrere Ergebnisse abfragen und eine IlluminateDatabaseEloquentCollection-Instanz zurückgeben. Die Collection-Klasse bietet viele Hilfsfunktionen für den Umgang mit Eloquent Ergebnis:

$flights = $flights->reject(function ($flight) { 
   return $flight->cancelled;
 });

Sie können die Sammlung wie ein Array durchlaufen:

foreach ($flights as $flight) {
    echo $flight->name;
  }

Chunked-Ergebnis

Wenn Sie Tausende von Eloquent-Ergebnissen verarbeiten müssen, verwenden Sie den Befehl chunk. Die Methode chunk ruft die „Blöcke“ im Eloquent-Modell ab und stellt sie dem angegebenen Handler Closure bereit. Wenn Sie große Ergebnismengen verarbeiten, verwenden Sie die Methode chunk, um Speicher zu sparen:

Flight::chunk(200, function ($flights) { 
   foreach ($flights as $flight) {   
        //  
      }
  });

Der erste an die Methode übergebene Parameter ist die Datenmenge, die jeder „Chunk“ empfangen soll. Der Abschluss wird als zweiter Parameter übergeben und jedes Mal aufgerufen, wenn ein Block aus der Datenbank abgerufen wird. Es führt die Datenbankabfrage aus und übergibt die abgerufenen Chunk-Ergebnisse an die Abschlussmethode.

Cursor verwenden Mit der Methode

cursor können Sie die Datenbank mithilfe eines Cursors durchqueren, der die Abfrage nur einmal ausführt. Beim Umgang mit großen Datenmengen kann die cursor-Methode die Speichernutzung erheblich reduzieren:

foreach (Flight::where('foo', 'bar')->cursor() as $flight) {
    //
 }

Ein einzelnes Modell/eine einzelne Sammlung abrufen

Zusätzlich zum Abrufen aller Datensätze aus der angegebenen Datentabelle können Sie find oder verwenden first Methode zum Abrufen eines einzelnen Datensatzes. Diese Methoden geben eine einzelne Modellinstanz anstelle einer Sammlung von Modellen zurück:

// 通过主键检索一个模型...
$flight = App\Flight::find(1);
// 检索符合查询限制的第一个模型...
$flight = App\Flight::where('active', 1)->first();

Sie können die Methode find auch mit einem Array von Primärschlüsseln als Argument aufrufen, wodurch eine Sammlung übereinstimmender Datensätze zurückgegeben wird:

$flights = App\Flight::find([1, 2, 3]);

Ausnahme „Nicht gefunden“

Manchmal möchten Sie eine Ausnahme auslösen, wenn ein Modell nicht gefunden wird. Dies ist bei Controllern und Routing sehr nützlich. Die Methoden findOrFail und firstOrFail rufen das erste Ergebnis der Abfrage ab und lösen, wenn es nicht gefunden wird, eine IlluminateDatabaseEloquentModelNotFoundException-Ausnahme aus:

$model = App\Flight::findOrFail(1);
$model = App\Flight::where('legs', '>', 100)->firstOrFail();

Wenn die Ausnahme nicht abgefangen wird, wird eine 404-Antwort ausgegeben wird automatisch an den Benutzer zurückgegeben. Das heißt, bei Verwendung dieser Methoden ist es nicht erforderlich, einen Scheck auszustellen, um eine 404-Antwort zurückzugeben: :

Route::get('/api/flights/{id}', function ($id) { 
   return App\Flight::findOrFail($id);
 });

Rufen Sie die Sammlung ab

Sie können auch die vom Abfrage-Builder bereitgestellten count, sum verwenden. max und andere Aggregatfunktionen. Diese Methoden geben einfach den entsprechenden Skalarwert und keine Modellinstanz zurück:

$count = App\Flight::where('active', 1)->count();
$max = App\Flight::where('active', 1)->max('price');

Insert & Modell aktualisieren

Einfügen

Um einen Datensatz zur Datenbank hinzuzufügen, erstellen Sie zunächst eine neue Modellinstanz und legen Sie fest Instanzeinstellungsattribut und rufen Sie dann die save-Methode auf:

<?php
    namespace App\Http\Controllers;
    use App\Flight;use Illuminate\Http\Request;
    use App\Http\Controllers\Controller;
    class FlightController extends Controller{   
     /**
     * 创建一个新的航班实例
     *
     * @param  Request  $request
     * @return Response
     */  
     public function store(Request $request)   
      {      
        // 校验请求...        
        $flight = new Flight;        
        $flight->name = $request->name;        
        $flight->save();  
        }
   }

In diesem Beispiel verwenden wir HTTP Der Anforderungsparameter name wird dem Attribut AppFlight der Modellinstanz name zugewiesen. Beim Aufruf der Methode save wird ein neuer Datensatz eingefügt. Die Zeitstempel created_at und updated_at werden automatisch gesetzt und es ist keine manuelle Zuweisung erforderlich. Die Methode

Update

save kann auch zum Aktualisieren von Modellen verwendet werden, die bereits in der Datenbank vorhanden sind. Um das Modell zu aktualisieren, müssen Sie es zuerst abrufen, die zu aktualisierenden Eigenschaften festlegen und dann die Methode save aufrufen. Ebenso wird der updated_at-Zeitstempel automatisch aktualisiert, sodass der Wert nicht manuell zugewiesen werden muss:

$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';$flight->save();

Batch-Update

kann auch mehrere Modelle aktualisieren den Abfragebedingungen entsprechen. In diesem Beispiel werden alle Flüge, deren active und destination San Diego sind, als verspätet markiert: Die Methode

App\Flight::where('active', 1)    
      ->where('destination', 'San Diego')          
      ->update(['delayed' => 1]);

update akzeptiert ein Array, dessen Schlüssel Feldnamen und Daten Werte sind.

{note} Bei der Stapelaktualisierung über Eloquent löst das aktualisierte Modell die Ereignisse saved und updated nicht aus. Denn bei Batch-Updates wird das Modell nie abgerufen.

Batch-Zuweisung

Sie können auch die Methode create verwenden, um ein neues Modell zu speichern, das eine Modellinstanz zurückgibt. Bevor Sie es verwenden, müssen Sie jedoch das Attribut fillable oder guarded im Modell angeben, da nicht alle Eloquent-Modelle standardmäßig die Stapelzuweisung unterstützen.

Wenn der Benutzer einen unerwarteten Parameter über eine HTTP-Anfrage übergibt und dieser Parameter ein Feld in der Datenbank ändert, das Sie nicht ändern müssen. Beispiel: Ein böswilliger Benutzer kann den Parameter is_admin über eine HTTP-Anfrage übergeben und ihn dann an die Methode create übergeben. Dieser Vorgang ermöglicht es dem Benutzer, sich selbst zum Administrator zu machen.

Bevor Sie beginnen, sollten Sie also definieren, welche Attribute auf dem Modell stapelweise zugewiesen werden können. Sie können dies über das Attribut $fillable am Modell tun. Zum Beispiel: Lassen Sie die Flight-Attribute des name-Modells stapelweise zuweisen:

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Flight extends Model{  
      /**
     * 可以被批量赋值的属性。
     *
     * @var array
     */   
     protected $fillable = ['name'];
  }

Sobald wir die Attribute eingerichtet haben, die stapelweise zugewiesen werden können, können wir über neue Daten in die Datenbank einfügen die create-Methode. Die Methode create gibt die gespeicherte Modellinstanz zurück:

$flight = App\Flight::create(['name' => 'Flight 10']);

Wenn Sie bereits über eine Modellinstanz verfügen, können Sie ein Array an die Methode fill übergeben, um Werte zuzuweisen:

$flight->fill(['name' => 'Flight 22']);

Geschützte Attribute

$fillable können als „Whitelist“ für die Batch-Zuweisung angesehen werden. Sie können dazu auch das Attribut $guarded verwenden. $guarded Das Attribut enthält ein Array, das keine Stapelzuweisung zulässt. Mit anderen Worten: $guarded funktioniert eher wie eine „Blacklist“. Hinweis: Sie können nur eines von $fillable oder $guarded verwenden, nicht beide gleichzeitig. Im folgenden Beispiel Außer dem Attribut price können alle anderen Attribute stapelweise zugewiesen werden:

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Flight extends Model{    
    /**
     * 不可批量赋值的属性。
     *
     * @var array
     */   
   protected $guarded = ['price'];
 }

Wenn Sie möchten, dass alle Attribute stapelweise zugewiesen werden, können Sie < verwenden 🎜> Definiert als leeres Array: $guarded

/**
 * 不可以批量赋值的属性。
 *
 * @var array
 */
 protected $guarded = [];

Andere Erstellungsmethoden

/ firstOrCreatefirstOrNew

Hier sind zwei Methoden, die Sie für die Stapelzuweisung verwenden können:

und firstOrCreate. Die firstOrNew-Methode gleicht die Daten in der Datenbank mit der angegebenen Spalte/dem angegebenen Wert ab. Wenn das entsprechende Modell nicht in der Datenbank gefunden werden kann, wird aus den Attributen des ersten Parameters und sogar den Attributen des zweiten Parameters ein Datensatz erstellt und in die Datenbank eingefügt. Die Methode firstOrCreate

versucht wie die Methode firstOrNew, einen Datensatz in der Datenbank anhand des angegebenen Attributs zu finden. Der Unterschied besteht darin, dass die Methode firstOrCreate das entsprechende Modell nicht findet und eine neue Modellinstanz zurückgibt. Beachten Sie, dass die von firstOrNew zurückgegebene Modellinstanz nicht in der Datenbank gespeichert wurde. Sie müssen zum Speichern die Methode firstOrNew manuell aufrufen: save

// 通过 name 来查找航班,不存在则创建...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// 通过 name 查找航班,不存在则使用 name 和 delayed 属性创建...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10'], ['delayed' => 1]);
//  通过 name 查找航班,不存在则创建一个实例...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
// 通过 name 查找航班,不存在则使用 name 和 delayed 属性创建一个实例...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10'], ['delayed' => 1]);

updateOrCreate

Es kann auch vorkommen, dass Sie ein vorhandenes Modell aktualisieren oder ein neues Modell erstellen möchten, wenn es nicht vorhanden ist. Laravel bietet die updateOrCreate-Methode, um dies in nur einem Schritt zu erreichen. Wie die firstOrCreate-Methode stimmt updateOrCreate mit dem entsprechenden Modell überein, daher besteht keine Notwendigkeit, die save()-Methode aufzurufen:

// 如果有从奥克兰到圣地亚哥的航班,则价格定为99美元。
// 如果没匹配到存在的模型,则创建一个。
$flight = App\Flight::updateOrCreate( 
   ['departure' => 'Oakland', 'destination' => 'San Diego'],    
   ['price' => 99]
 );

Modell löschen

kann für Modellinstanzen aufgerufen werdendelete Methode zum Löschen von Instanzen:

$flight = App\Flight::find(1);
$flight->delete();

Modell nach Primärschlüssel löschen

Im obigen Beispiel müssen Sie das entsprechende Modell in der Datenbank finden, bevor Sie delete aufrufen. Wenn Sie den Primärschlüssel des Modells kennen, können Sie das Modell tatsächlich direkt mit der Methode destroy löschen, ohne es zuerst in der Datenbank nachzuschlagen. Zusätzlich zum Akzeptieren eines einzelnen Primärschlüssels als Parameter akzeptiert die destroy-Methode auch mehrere Primärschlüssel oder verwendet Arrays und Sammlungen, um mehrere Primärschlüssel zu speichern:

App\Flight::destroy(1);
App\Flight::destroy(1, 2, 3);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(collect([1, 2, 3]));

Modell löschen durch Abfrage

Sie können auch Löschanweisungen für das Modell ausführen. In diesem Beispiel löschen wir alle als inaktiv markierten Flüge. Wie bei der Stapelaktualisierung löst auch die Stapellöschung keine Modellereignisse für das gelöschte Modell aus:

$deletedRows = App\Flight::where('active', 0)->delete();

{note} Wenn die Stapellöschanweisung über Eloquent ausgeführt wird, werden die Modelle deleting und deleted nicht ausgeführt Ereignis ausgelöst werden. Daher werden die Modellbeispiele beim Ausführen einer Löschanweisung nie abgerufen.

Vorläufiges Löschen

Zusätzlich zum tatsächlichen Löschen von Datenbankeinträgen kann Eloquent auch „vorläufig löschen“ das Modell. Ein vorläufig gelöschtes Modell wird nicht tatsächlich aus der Datenbank gelöscht. Tatsächlich wird das Attribut deleted_at im Modell festgelegt und sein Wert in die Datenbank geschrieben. Wenn der Wert deleted_at nicht leer ist, bedeutet dies, dass dieses Modell vorläufig gelöscht wurde. Wenn Sie die Funktion zum vorläufigen Löschen des Modells aktivieren möchten, müssen Sie das Merkmal IlluminateDatabaseEloquentSoftDeletes für das Modell verwenden:

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\SoftDeletes;
    class Flight extends Model{
        use SoftDeletes;
       }

{tip} Das Merkmal SoftDeletes konvertiert automatisch das Attribut deleted_at in DateTime / Carbon Beispiel

Natürlich müssen Sie deleted_at einfügen Felder werden zur Datentabelle hinzugefügt. Die Datenbankmigration von Laravel verfügt über eine Methode zum Erstellen dieses Felds:

Schema::table('flights', function (Blueprint $table) 
{  
  $table->softDeletes();
});

Wenn Sie nun die Methode delete für die Modellinstanz verwenden, werden das aktuelle Datum und die aktuelle Uhrzeit in das Feld deleted_at geschrieben. Gleichzeitig werden in den Abfrageergebnissen automatisch vorläufig gelöschte Datensätze ausgeschlossen.

Sie können die Methode trashed verwenden, um zu überprüfen, ob das aktuelle Modell vorläufig gelöscht wurde:

if ($flight->trashed()) {
    //
 }

Abfrage das weich gelöschte Modell

Vorläufig gelöschte Modelle einbeziehen

Wie bereits erwähnt, schließen die Abfrageergebnisse automatisch vorläufig gelöschte Ergebnisse aus. Natürlich können Sie die Methode withTrashed verwenden, um Modelle einschließlich vorläufig gelöschter Modelle abzurufen:

$flights = App\Flight::withTrashed()           
     ->where('account_id', 1)                
     ->get();

withTrashed Die Methode kann auch in verwandten Abfragen verwendet werden:

$flight->history()->withTrashed()->get();

Vorläufig gelöschtes Modell abrufen

onlyTrashed Methode NurVorläufig gelöschte Modelle abrufen:

$flights = App\Flight::onlyTrashed()           
     ->where('airline_id', 1)                
     ->get();

Vorläufig gelöschte Modelle wiederherstellen

Manchmal werden vorläufig gelöschte Modelle „rückgängig gemacht“ Verwenden Sie restore auf vorläufig gelöschte Daten Methode zum Wiederherstellen eines gültigen Zustands:

$flight->restore();

Sie können die Methode restore auch in einer Abfrage verwenden, um mehrere Modelle schnell wiederherzustellen. Wie andere Batch-Operationen löst diese Operation keine Ereignisse im Modell aus:

App\Flight::withTrashed()     
   ->where('airline_id', 1)        
   ->restore();

Ähnlich wie die Methode withTrashed wird auch die Methode restore in Assoziationen verwendet:

$flight->history()->restore();

Endgültiges Löschen

Wenn Sie Daten tatsächlich löschen möchten, verwenden Sie forceDelete Die Methode ist:

// 单个模型实例的永久删除...
$flight->forceDelete();
// 关联模型的永久删除...
$flight->history()->forceDelete();

Abfragebereich

Globaler Bereich

Der globale Bereich kann Einschränkungen zu Modellabfragen hinzufügen. Die Soft-Delete-Funktion von Laravel nutzt diese Funktion, um „nicht gelöschte“ Modelle aus der Datenbank abzurufen. Sie können ganz einfach und bequem Ihren eigenen globalen Bereich schreiben und jeder Modellabfrage Einschränkungen hinzufügen:

Globalen Bereich schreiben

Globalen Bereich schreiben Der Bereich ist einfach. Definieren Sie eine Klasse, die die IlluminateDatabaseEloquentScope-Schnittstelle implementiert, und implementieren Sie die apply-Methode. Fügen Sie je nach Bedarf die apply-Bedingung der Abfrage in der where-Methode hinzu:

<?php
    namespace App\Scopes;
    use Illuminate\Database\Eloquent\Scope;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Builder;
    class AgeScope implements Scope{  
      /**
     * 把约束加到 Eloquent 查询构造中。
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */  
      public function apply(Builder $builder, Model $model)  
        {       
         $builder->where('age', '>', 200);   
         }
      }

{tip} Wenn Sie Felder in der Select-Anweisung hinzufügen müssen, sollten Sie die addSelectMethode statt selectMethode. Dadurch wird effektiv verhindert, dass vorhandene Select-Anweisungen versehentlich ersetzt werden.

Globalen Geltungsbereich anwenden

Um einem Modell einen globalen Geltungsbereich zuzuweisen, müssen Sie die boot-Methode des Modells überschreiben und die addGlobalScope-Methode verwenden : Nachdem

<?php
    namespace App;use App\Scopes\AgeScope;
    use Illuminate\Database\Eloquent\Model;
    class User extends Model{  
      /**
     *  模型的 「启动」 方法.
     *
     * @return void
     */  
     protected static function boot()  
       {     
          parent::boot();        
          static::addGlobalScope(new AgeScope);  
        }
   }

den Bereich hinzugefügt hat, generiert die Abfrage für User::all() das folgende SQL Abfrageanweisung:

select * from `users` where `age` > 200

Anonymer globaler Bereich

Eloquent ermöglicht auch die Verwendung von Abschlüssen zum Definieren globaler Bereiche, sodass kein einfacher Bereich geschrieben werden muss. Einzelne Klassen:

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Database\Eloquent\Builder;
    class User extends Model{  
      /**
     *模型的「启动」方法.
     *
     * @return void
     */  
     protected static function boot()   
      {      
        parent::boot();        
        static::addGlobalScope('age', function (Builder $builder) {  
                  $builder->where('age', '>', 200);       
                }); 
       }
   }

Globalen Bereich aufheben

Wenn Sie den globalen Bereich für die aktuelle Abfrage aufheben müssen, müssen Sie die Methode withoutGlobalScope verwenden. Diese Methode akzeptiert nur den Klassennamen des globalen Bereichs als einzigen Parameter:

User::withoutGlobalScope(AgeScope::class)->get();

Oder, wenn ein Abschluss zum Definieren des globalen Bereichs verwendet wird:

User::withoutGlobalScope('age')->get();

Wenn Sie einen Teil oder alles abbrechen müssen Für den globalen Bereich müssen Sie withoutGlobalScopes verwenden Methode:

// 取消所有的全局作用域...
User::withoutGlobalScopes()->get();
// 取消部分全局作用域...
User::withoutGlobalScopes([ 
   FirstScope::class, SecondScope::class
 ])->get();

Lokaler Bereich

Der lokale Bereich ermöglicht die Definition eines gemeinsamen Satzes von Einschränkungen für die Verwendung in der Anwendung Wiederverwendung. Beispielsweise müssen Sie häufig alle „beliebten“ Benutzer erfassen. Um einen solchen Bereich zu definieren, fügen Sie einfach das Präfix scope vor der entsprechenden Eloquent-Modellmethode hinzu:

Scope gibt immer eine Abfrage-Builder-Instanz zurück:

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class User extends Model{  
      /**
     * 只查询受欢迎的用户的作用域.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */   
      public function scopePopular($query)  
        {      
          return $query->where('votes', '>', 100);   
        }    
     /**
     * 只查询 active 用户的作用域.
     *
     * @param \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */  
      public function scopeActive($query)  
        {      
          return $query->where('active', 1);  
         }
      }

Verwendung lokaler Bereiche

Sobald ein Bereich definiert ist, können Bereichsmethoden aufgerufen werden, wenn dieses Modell abgefragt wird. Es ist jedoch nicht erforderlich, beim Aufruf dieser Methoden das Präfix scope anzugeben. Sie können sogar Aufrufe an mehrere Bereiche verketten, zum Beispiel:

$users = App\User::popular()->active()->orderBy('created_at')->get();

Verwenden Sie den or Abfrageläufer, um mehrere Eloquent-Modelle zu integrieren. Möglicherweise müssen Sie Abschlussrückrufe verwenden:

$users = App\User::popular()->orWhere(function (Builder $query) {
    $query->active();
   })->get();

, da dies der Fall sein kann Es ist etwas mühsam, Laravel bietet „High-Level“ orWhere Methode, mit der Sie Aufrufbereiche verketten können, ohne Abschlüsse zu verwenden:

$users = App\User::popular()->orWhere->active()->get();

Dynamic Scope

Manchmal kann es wünschenswert sein, eine Rolle zu definieren, die Argumentdomänen akzeptiert. Dies kann durch die Übergabe zusätzlicher Parameter an den Bereich erreicht werden. Bereichsparameter sollten in $query platziert werden Nach den Parametern:

<?php
    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class User extends Model{   
     /**
     * 将查询作用域限制为仅包含给定类型的用户。
     *
     * @param  \Illuminate\Database\Eloquent\Builder $query
     * @param  mixed $type
     * @return \Illuminate\Database\Eloquent\Builder
     */   
    public function scopeOfType($query, $type)  
      {      
        return $query->where('type', $type);   
       }
      }

Auf diese Weise können Sie beim Aufruf des Scopes die Parameter übergeben:

$users = App\User::ofType('admin')->get();

Modellvergleich

Manchmal müssen Sie möglicherweise feststellen, ob zwei Modelle „gleich“ sind. Mit der is-Methode kann schnell überprüft werden, ob zwei Modelle dieselben Primärschlüssel, Tabellen und Datenbankverbindungen haben:

if ($post->is($anotherPost)) { 
   //
 }

Ereignisse

Eloquente Modelle lösen mehrere Ereignisse aus, sodass Sie sich in die folgenden Knoten des Modelllebenszyklus einbinden können: retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring und restored. Mithilfe von Ereignissen können Sie Code immer dann ausführen, wenn ein bestimmtes Modell in der Datenbank gespeichert oder aktualisiert wird. Jedes Ereignis akzeptiert eine Modellinstanz über seinen Konstruktor. Das Ereignis

retrieved wird ausgelöst, wenn ein vorhandenes Modell Daten aus der Datenbank nachschlägt. Jedes Mal, wenn ein neues Modell gespeichert wird, werden die Ereignisse creating und created ausgelöst. Wenn das Modell bereits in der Datenbank vorhanden ist und die Methode save aufgerufen wird, werden die Ereignisse updating / updated ausgelöst. In diesen Fällen werden auch die Ereignisse saving / saved ausgelöst.

{note} Bei der Durchführung von Stapelaktualisierungen über Eloquent werden die Ereignisse saved und updated des aktualisierten Modells nicht ausgelöst. Dies liegt daran, dass das Modell während der Batch-Aktualisierung nicht tatsächlich abgerufen wird.

Definieren Sie zunächst ein $dispatchesEvents-Attribut für das Eloquent-Modell, um mehrere Knoten des Eloquent-Modelllebenszyklus Ihrer eigenen Ereignisklasse zuzuordnen:

<?php
    namespace App;
    use App\Events\UserSaved;
    use App\Events\UserDeleted;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    class User extends Authenticatable{  
      use Notifiable;   
       /**
     * 为模型事件。
     *
     * @var array
     */ 
      protected $dispatchesEvents = [    
          'saved' => UserSaved::class,        
          'deleted' => UserDeleted::class,   
           ];
       }

definiert Eloquent-Ereignisse und ordnet sie zu können Sie Ereignis-Listener verwenden, um diese Ereignisse zu verarbeiten.

Beobachter

Beobachter definieren

Wenn in einem Es gibt Mehrere Ereignisse werden im Modell abgehört, und Beobachter können verwendet werden, um diese Zuhörer in einer separaten Klasse zu organisieren. Die Methodennamen der Beobachterklasse sind den Eloquent-Ereignissen zugeordnet, die Sie abhören möchten. Diese Methoden verwenden alle das Modell als einzigen Parameter. make:observer Der Artisan-Befehl kann schnell eine neue Beobachterklasse erstellen:

php artisan make:observer UserObserver --model=User

Dieser Befehl platziert eine neue Beobachterklasse im Ordner App/Observers. Wenn dieses Verzeichnis nicht existiert, wird Artisan es für Sie erstellen. Verwenden Sie die folgende Methode, um Beobachter zu aktivieren:

<?php
    namespace App\Observers;
    use App\User;
    class UserObserver{   
     /**
     * 处理 User 「新建」事件。
     *
     * @param  \App\User  $user
     * @return void
     */   
      public function created(User $user) 
         {      
           //  
          }   
     /**
     * 处理 User 「更新」 事件。
     *
     * @param  \App\User  $user
     * @return void
     */   
      public function updated(User $user)  
        {      
          //   
         }   
     /**
     * 处理 User 「删除」 事件。
     *
     * @param  \App\User  $user
     * @return void
     */   
     public function deleted(User $user) 
        {   
             //   
         }
   }

Verwenden Sie die Methode observe, um einen Beobachter für das Modell zu registrieren, das Sie beobachten möchten. Beobachter können auch im boot-Verfahren des Dienstleisters registriert werden. Hier ist ein Beispiel für die Registrierung eines Beobachters in AppServiceProvider:

<?php
    namespace App\Providers;
    use App\User;use App\Observers\UserObserver;
    use Illuminate\Support\ServiceProvider;
    class AppServiceProvider extends ServiceProvider{  
      /**
     * 启动应用服务。
     *
     * @return void
     */   
      public function boot()  
       {       
         User::observe(UserObserver::class);   
       }  
    /**
     * 注册服务提供者。
     *
     * @return void
     */  
     public function register() 
        {      
          //   
         }
      }
Dieser Artikel erschien zuerst auf der Website LearnKu.com.