Eloquent: find() und where() verwenden Laravel

Lesezeit: 3 Minuten

Benutzer-Avatar
Awa Melvine

Ich versuche, eine Aufzeichnung von a zu bekommen posts Datenbanktabelle mit ihrer ID. Ich habe mir schon seit einiger Zeit den Kopf über die Methode find() geschlagen, verwirrt darüber, warum sie nicht funktioniert hat. Hier ist meine Abfrage, die für mich richtig aussieht, aber nicht funktioniert hat:

$post = Post::find($id);
$post->delete();

Widerwillig tat ich dies:

$post = Post::where('id', $id);
$post->delete();

und überraschenderweise funktionierte es, aber ich habe keine Ahnung wie.

Das kenne ich auch anders find(), where() ist ein Abfrage-Generator und daher könnte ich ihn auch so verwenden:
Post::where('id', $id)->first()

Irgendwelche Ideen über den Unterschied in der Art und Weise, wie die Methoden funktionieren?

Ihr Code sieht gut aus, aber es gibt ein paar Dinge zu beachten:

Post::find($id); wirkt auf den Primärschlüssel, wenn Sie Ihren Primärschlüssel in Ihrem Modell auf etwas anderes als eingestellt haben id dadurch:

protected  $primaryKey = 'slug';

dann find sucht stattdessen nach diesem Schlüssel.

Auch Laravel erwartet die id Um eine Ganzzahl zu sein, müssen Sie, wenn Sie etwas anderes als eine Ganzzahl (z. B. eine Zeichenfolge) verwenden, die inkrementierende Eigenschaft Ihres Modells auf „false“ setzen:

public $incrementing = false;

  • Es gibt jedoch große Unterschiede in der Ausführung des Löschvorgangs. Wenn Sie die Modellinstanz zum Löschen verwenden, dh $post->delete(), werden zwei Abfragen ausgeführt. Einer zum Abrufen des Datensatzes aus der Datenbank mit der Methode find () und der zweite zum Löschen des Datensatzes. Bei Verwendung des Abfragegenerators wird nur eine Abfrage ausgeführt, die Modellinstanz wird nie erstellt. Infolgedessen funktionieren alle Funktionen des Post-Modells nicht. Wenn Sie beispielsweise einen Listener für das Löschen von Modellereignissen haben, wird dieser nicht ausgeführt.

    – Ahmed Shefeer

    24. Juli 2018 um 7:09 Uhr

  • Ahmeds Antwort sollte hervorgehoben werden, da der Unterschied viel Verwirrung stiften kann.

    – Mathieu Bur

    15. Mai 2019 um 2:43 Uhr


  • und kann diese verwenden. User::find($obj) welches obj die ID als Fremdschlüssel hat und als user_id benannt ist (Tabellenname plus “_id”)

    – Jovyle

    8. Dezember 2021 um 10:43 Uhr

Benutzer-Avatar
Miqayel

Nicht gefundene Ausnahmen

Manchmal möchten Sie vielleicht eine Ausnahme auslösen, wenn ein Modell nicht gefunden wird. Dies ist besonders nützlich in Fahrstraßen oder Steuerungen. Das findOrFail und firstOrFail Methoden rufen das erste Ergebnis der Abfrage ab. Wenn jedoch kein Ergebnis gefunden wird, a Illuminate\Database\Eloquent\ModelNotFoundException wird geworfen:

$model = App\Flight::findOrFail(1);

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

Wenn die Ausnahme nicht abgefangen wird, wird automatisch eine 404-HTTP-Antwort an den Benutzer zurückgesendet. Es ist nicht notwendig, explizite Prüfungen zu schreiben, um 404-Antworten zurückzugeben, wenn diese Methoden verwendet werden:

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

Benutzer-Avatar
SlyDave

Um den obigen Kommentar von craig_h zu ergänzen (ich habe derzeit nicht genug Vertreter, um dies als Kommentar zu seiner Antwort hinzuzufügen, sorry), wenn Ihr Primärschlüssel keine Ganzzahl ist, sollten Sie Ihrem Modell auch mitteilen, welchen Datentyp er hat ist, indem Sie keyType oben in der Modelldefinition festlegen.

public $keyType="string"

Eloquent versteht alle Typen, die in definiert sind castAttribute() Funktion, die ab Laravel 5.4 sind: int, float, string, bool, object, array, collection, date und timestamp.

Dadurch wird sichergestellt, dass Ihr Primärschlüssel korrekt in den entsprechenden PHP-Datentyp umgewandelt wird.

1336400cookie-checkEloquent: find() und where() verwenden Laravel

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy