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 haben Cat Modell
  • Eine jungle_cats Tabelle hätte ein JungleCat Modell
  • Eine users hätte ein User
  • Ein people hätte ein Person

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

Eloquente Beziehung

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 und except 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 und deleted 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.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow