Schnellstart
Eloquent: Erste Schritte
- Einführung
- Modelldefinition
- Modellabruf
- Ein einzelnes Modell abrufen / Sammlung
- Einfügen & Modell aktualisieren
- Modell löschen
- Abfrageumfang
- Modellvergleich
- Ereignisse
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 -mEloquente ModellkonventionenSchauen 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'; }DatenbankverbindungStandardmäß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, ]; }ModellabrufNachdem 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
undupdated
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
/ firstOrCreate
firstOrNew
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
unddeleted
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 Attributdeleted_at
inDateTime
/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
addSelect
Methode stattselect
Methode. 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
undupdated
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() { // } }