Suche…
Einführung
Das Eloquent ist ein im Laravel enthaltenes ORM (Object Relational Model). Es implementiert das aktive Datensatzmuster und wird zur Interaktion mit relationalen Datenbanken verwendet.
Bemerkungen
Benennung der Tabelle
Die Konvention ist die Verwendung von "snake_case" für Tabellennamen und "StudlyCase" für Modellnamen. Zum Beispiel:
- Ein
cats
- Tabelle würde eine habenCat
Modell - Eine
jungle_cats
Tabelle hätte einJungleCat
Modell - Eine
users
hätte einUser
- Ein
people
hätte einPerson
Eloquent versucht automatisch, Ihr Modell mit einer Tabelle zu verbinden, die den Plural des Modellnamens enthält, wie oben angegeben.
Sie können jedoch einen Tabellennamen angeben, um die Standardkonvention zu überschreiben.
class User extends Model
{
protected $table = 'customers';
}
Einführung
Eloquent ist der ORM, der in das Laravel-Gerüst eingebaut ist. Sie können mit Ihren Datenbanktabellen objektorientiert mit dem ActiveRecord- Muster interagieren.
Eine einzelne Modellklasse wird normalerweise einer einzelnen Datenbanktabelle zugeordnet. Außerdem können Beziehungen verschiedener Typen ( Eins-zu-Eins , Eins-zu-Viele , Viele-Zu-Viele , Polymorph) zwischen verschiedenen Modellklassen definiert werden.
Der Abschnitt Modell erstellen beschreibt die Erstellung und Definition von Modellklassen.
Bevor Sie mit der Verwendung von Eloquent-Modellen beginnen können, müssen Sie sicherstellen, dass in der Konfigurationsdatei config/database.php
mindestens eine config/database.php
konfiguriert ist.
Um die Verwendung des eloquenten Query Builders während der Entwicklung zu verstehen, können Sie den php artisan ide-helper:generate
Befehl php artisan ide-helper:generate
. Hier ist der Link .
Unterthemen-Navigation
Anhalten
Neben dem Lesen von Daten mit Eloquent können Sie auch Daten mit der save()
-Methode einfügen oder aktualisieren. Wenn Sie eine neue Modellinstanz erstellt haben, wird der Datensatz eingefügt . Andernfalls wird das Modell aktualisiert , wenn Sie ein Modell aus der Datenbank abgerufen und neue Werte festgelegt haben.
In diesem Beispiel erstellen wir einen neuen User
:
$user = new User();
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->email = '[email protected]';
$user->password = bcrypt('my_password');
$user->save();
Sie können die create
Methode auch verwenden, create
Felder mit einem Datenarray aufzufüllen:
User::create([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
Bei Verwendung der create-Methode sollten Ihre Attribute im fillable
Array innerhalb Ihres Modells deklariert werden:
class User extends Model
{
protected $fillable = [
'first_name',
'last_name',
'email',
'password',
];
}
Wenn Sie alle Attribute massenzuweisbar machen möchten, können Sie die $ guarded -Eigenschaft als leeres Array definieren:
class User extends Model
{
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = [];
}
Sie können jedoch auch einen Datensatz erstellen, ohne das fillable
Attribut in Ihrem Modell zu forceCreate
, indem Sie die forceCreate
Methode anstelle der create
Methode verwenden
User::forceCreate([
'first_name'=> 'John',
'last_name' => 'Doe',
'email' => '[email protected]',
'password' => bcrypt('changeme'),
]);
Im Folgenden finden Sie ein Beispiel zum Aktualisieren eines vorhandenen User
, indem Sie es zunächst laden (mithilfe von find
), ändern und anschließend speichern.
$user = User::find(1);
$user->password = bcrypt('my_new_password');
$user->save();
Um dieselbe Leistung mit einem einzelnen Funktionsaufruf zu erreichen, können Sie die update
verwenden:
$user->update([
'password' => bcrypt('my_new_password'),
]);
Die Methoden zum create
und update
machen die Arbeit mit großen Datensätzen viel einfacher, als jedes Schlüssel / Wert-Paar einzeln einstellen zu müssen, wie in den folgenden Beispielen gezeigt:
Beachten Sie die Verwendung von
only
undexcept
wenn Anforderungsdaten zu sammeln. Es ist wichtig, dass Sie genau die Schlüssel angeben, die aktualisiert werden sollen / nicht zulassen. Andernfalls kann ein Angreifer zusätzliche Felder mit seiner Anforderung senden und unerwünschte Aktualisierungen verursachen.
// Updating a user from specific request data
$data = Request::only(['first_name', 'email']);
$user->find(1);
$user->update($data);
// Create a user from specific request data
$data = Request::except(['_token', 'profile_picture', 'profile_name']);
$user->create($data);
Löschen
Sie können Daten löschen, nachdem Sie sie in die Datenbank geschrieben haben. Sie können entweder eine Modellinstanz löschen, wenn Sie eine Instanz abgerufen haben, oder Bedingungen angeben, unter denen die Datensätze gelöscht werden sollen.
Um eine Modellinstanz zu löschen, rufen Sie sie ab und rufen die delete()
-Methode auf:
$user = User::find(1);
$user->delete();
Alternativ können Sie einen Primärschlüssel (oder ein Array von Primärschlüsseln) der Datensätze angeben, die Sie über die destroy()
Methode löschen möchten:
User::destroy(1);
User::destroy([1, 2, 3]);
Sie können das Abfragen auch mit dem Löschen kombinieren:
User::where('age', '<', 21)->delete();
Dadurch werden alle Benutzer gelöscht, die der Bedingung entsprechen.
Hinweis: Wenn Sie eine Massenlöschanweisung über Eloquent ausführen, werden die
deleting
unddeleted
Modellereignisse für die gelöschten Modelle nicht ausgelöst. Dies liegt daran, dass die Modelle beim Ausführen der Löschanweisung nie tatsächlich abgerufen werden.
Weiches Löschen
Manchmal möchten Sie einen Datensatz nicht dauerhaft löschen, sondern ihn zu Prüf- oder Berichterstellungszwecken aufbewahren. Dafür bietet Eloquent die Funktion zum sanften Löschen .
Um Ihrem Modell Soft Deletes-Funktionen hinzuzufügen, müssen Sie das SoftDeletes
Merkmal importieren und es Ihrer Eloquent-Modellklasse hinzufügen:
namespace Illuminate\Database\Eloquent\Model;
namespace Illuminate\Database\Eloquent\SoftDeletes;
class User extends Model
{
use SoftDeletes;
}
Wenn Sie ein Modell löschen, wird ein Zeitstempel für eine Zeitstempel-Spalte ' deleted_at
in der Tabelle für Ihr Modell festgelegt. Erstellen Sie daher zuerst die Spalte deleted_at
in Ihrer Tabelle. Oder Sie sollten bei der Migration die Methode softDeletes()
in Ihrem Blueprint deleted_at
, um den Zeitstempel deleted_at
hinzuzufügen. Beispiel:
Schema::table('users', function ($table) {
$table->softDeletes();
});
Bei allen Abfragen werden nicht gelöschte Datensätze ausgelassen. Sie können sie mit Hilfe des withTrashed()
erzwingen, wenn Sie möchten:
User::withTrashed()->get();
Wenn Sie Benutzern das Wiederherstellen eines Datensatzes nach dem Soft-Löschen ermöglichen möchten (z. B. in einem Papierkorb), können Sie die restore()
Methode verwenden:
$user = User::find(1);
$user->delete();
$user->restore();
Um einen Datensatz zwangsweise zu löschen, verwenden Sie die forceDelete()
-Methode, die den Datensatz wirklich aus der Datenbank entfernt:
$user = User::find(1);
$user->forceDelete();
Primärschlüssel und Zeitstempel ändern
Standardmäßig erwarten Eloquent-Modelle, dass der Primärschlüssel 'id'
. Wenn dies nicht Ihr Fall ist, können Sie den Namen Ihres Primärschlüssels ändern, indem Sie die Eigenschaft $primaryKey
.
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
// ...
}
Jetzt verwenden alle Eloquent-Methoden, die Ihren Primärschlüssel verwenden (z. B. find
oder findOrFail
), diesen neuen Namen.
Darüber hinaus erwartet Eloquent, dass der Primärschlüssel eine automatisch inkrementierende Ganzzahl ist. Wenn Ihr Primärschlüssel keine automatisch inkrementierende Ganzzahl ist (z. B. eine GUID), müssen Sie Eloquent mitteilen, indem Sie die $incrementing
Eigenschaft auf false
:
class Citizen extends Model
{
protected $primaryKey = 'socialSecurityNo';
public $incrementing = false;
// ...
}
Standardmäßig erwartet Eloquent, dass die created_at
und updated_at
in Ihren Tabellen vorhanden sind. Wenn Sie nicht möchten, dass diese Spalten automatisch von Eloquent verwaltet werden, setzen Sie die $timestamps
Ihres Modells auf false:
class Citizen extends Model
{
public $timestamps = false;
// ...
}
Wenn Sie die Namen der Spalten anpassen müssen, die zum Speichern der Zeitstempel verwendet werden, können Sie die Konstanten CREATED_AT
und UPDATED_AT
in Ihrem Modell UPDATED_AT
:
class Citizen extends Model
{
const CREATED_AT = 'date_of_creation';
const UPDATED_AT = 'date_of_last_update';
// ...
}
Werfen Sie 404, wenn die Entität nicht gefunden wurde
Wenn Sie bei der Suche nach einem Datensatz, der in einem Modal nicht gefunden wird, automatisch eine Ausnahme auslösen möchten, können Sie eine der beiden verwenden
Vehicle::findOrFail(1);
oder
Vehicle::where('make', 'ford')->firstOrFail();
Wenn kein Datensatz mit dem Primärschlüssel 1
gefunden wird, wird eine ModelNotFoundException
ausgelöst. Welches ist im Wesentlichen dasselbe wie das Schreiben ( Quelltext anzeigen ):
$vehicle = Vehicle::find($id);
if (!$vehicle) {
abort(404);
}
Klonen von Modellen
Möglicherweise müssen Sie eine Reihe klonen, einige Attribute ändern, aber Sie benötigen eine effiziente Möglichkeit, die Dinge trocken zu halten. Laravel bietet eine Art "versteckter" Methode, um diese Funktion ausführen zu können. Obwohl es völlig undokumentiert ist, müssen Sie die API durchsuchen, um sie zu finden.
Mit $model->replicate()
Sie einen Datensatz einfach klonen
$robot = Robot::find(1);
$cloneRobot = $robot->replicate();
// You can add custom attributes here, for example he may want to evolve with an extra arm!
$cloneRobot->arms += 1;
$cloneRobot->save();
Das Obige würde einen Roboter mit der ID 1 finden und dann klonen.