laravel bietet viele leistungsstarke Funktionen, die dazu beitragen, unsere Entwicklungserfahrung (DX) zu verbessern. Mit regelm??igen Ver?ffentlichungen, dem Stress der t?glichen Arbeit und dem Aufkommen einer gro?en Anzahl verfügbarer Funktionen k?nnen einige weniger bekannte Funktionen, die unseren Code verbessern k?nnen, leicht zu verpassen.
In diesem Artikel wird einige meiner Lieblings -Tipps zur Verwendung von Laravel -Modellen vorgestellt. Hoffentlich helfen diese Tipps Ihnen, sauberer, effizienter Code zu schreiben und h?ufige Fallstricke zu vermeiden.
entdecken und verhindern Sie N 1 Probleme
Wir werden zun?chst vorstellen, wie man N 1 Abfrageprobleme entdeckt und verhindern.
Wenn die Assoziation verz?gert wird, k?nnen h?ufig N 1 -Abfrageprobleme auftreten, wobei n die Anzahl der Abfragen ist, die ausgeführt werden, um das zugeh?rige Modell zu erhalten.
Was bedeutet das? Schauen wir uns ein Beispiel an. Angenommen, wir m?chten alle Beitr?ge aus der Datenbank erhalten, durch sie iterieren und auf den Benutzer zugreifen, der den Beitrag erstellt hat. Unser Code k?nnte so aussehen:
$posts = Post::all(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
Obwohl der obige Code gut aussieht, verursacht er tats?chlich N 1 -Probleme. Angenommen, es gibt 100 Beitr?ge in der Datenbank. In der ersten Zeile werden wir eine einzige Frage ausführen, um alle Beitr?ge zu erhalten. In der $post->user
-Scheinung von Zugriff auf foreach
wird dann eine neue Abfrage ausgel?st, um den Benutzer des Posts zu erhalten. Dies bedeutet, dass wir insgesamt 101 Abfragen ausführen werden. Wie Sie sich vorstellen k?nnen, ist das nicht gut! Es verlangsamt die Anwendung und setzt unn?tige Druck auf die Datenbank aus.
Wenn der Code immer komplexer wird und die Funktionen immer schwieriger zu erkennen sind, es sei denn, Sie suchen aktiv nach diesen Problemen.
Zum Glück bietet Laravel eine bequeme Model::preventLazyLoading()
-Methode, mit der Sie diese Probleme entdecken und verhindern k?nnen. Diese Methode weist Laravel an, eine Ausnahme zu machen, wenn das faule Laden der Beziehung so l?dt, dass Ihre Beziehung immer eifrig geladen ist.
Um diese Methode zu verwenden, fügen Sie den Methodenaufruf Model::preventLazyLoading()
Ihrer AppProvidersAppServiceProvider
-Klasse hinzu:
namespace App\Providers; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Model::preventLazyLoading(); } }
Wenn wir nun den obigen Code ausführen m?chten, um jeden Beitrag zu erhalten und auf den Benutzer zuzugreifen, der diesen Beitrag erstellt hat, werden wir eine IlluminateDatabaseLazyLoadingViolationException
-Ausnahme mit der folgenden Nachricht sehen:
<code>嘗試在模型 [App\Models\Post] 上延遲加載 [user],但延遲加載已禁用。</code>
Um dieses Problem zu beheben, k?nnen wir den Code aktualisieren, um Benutzerbeziehungen beim Erhalten von Beitr?gen eifrig zu laden. Wir k?nnen die with
-Methode verwenden, um zu erreichen:
$posts = Post::with('user')->get(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
Der obige Code wird nun erfolgreich ausgeführt und l?st nur zwei Abfragen aus: eine, um alle Beitr?ge und die andere für alle Benutzer zu erhalten, die diese Beitr?ge erhalten.
Eigenschaften, um den Zugriff auf fehlende
zu verhindern Wie oft versuchen Sie, auf Felder zugreifen zu k?nnen, von denen Sie glauben, dass sie auf dem Modell existieren, aber nicht existieren? M?glicherweise haben Sie einen Fehler eingegeben oder denken vielleicht, dass es ein full_name
Feld gibt, obwohl es tats?chlich name
genannt wird.
Angenommen, wir haben ein AppModelsUser
Modell mit den folgenden Feldern:
-
id
-
name
-
email
-
password
-
created_at
-
updated_at
Was passiert, wenn wir den folgenden Code ausführen? :
$posts = Post::all(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
Angenommen, wir haben keinen full_name
-Accessor auf dem Modell, die $name
Variable ist null
. Aber wir wissen nicht, ob dies daran liegt, dass das Feld full_name
tats?chlich null
oder weil wir das Feld nicht aus der Datenbank erhalten haben oder weil das Feld im Modell nicht vorhanden ist. Wie Sie sich vorstellen k?nnen, kann dies zu unerwartetem Verhalten führen und manchmal schwierig zu erkennen sein.
laravel bietet eine Model::preventAccessingMissingAttributes()
-Methode, mit der Sie dieses Problem verhindern k?nnen. Diese Methode weist Laravel an, eine Ausnahme zu machen, wenn Sie versuchen, auf ein Feld zuzugreifen, das auf der aktuellen Instanz des Modells nicht vorhanden ist.
Um diese Funktion zu aktivieren, fügen Sie den Methodenaufruf Model::preventAccessingMissingAttributes()
Ihrer AppProvidersAppServiceProvider
-Klasse hinzu:
namespace App\Providers; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Model::preventLazyLoading(); } }
Wenn wir jetzt unseren Beispielcode ausführen und versuchen m?chten, auf das Feld AppModelsUser
auf dem Modell full_name
zuzugreifen, werden wir eine Ausnahme von IlluminateDatabaseEloquentMissingAttributeException
mit der folgenden Nachricht sehen:
<code>嘗試在模型 [App\Models\Post] 上延遲加載 [user],但延遲加載已禁用。</code>
Ein weiterer Vorteil der Verwendung von preventAccessingMissingAttributes
besteht darin, dass sie die Situation hervorhebt, in der wir versuchen, Felder zu lesen, die vorhanden sind, aber m?glicherweise nicht auf das Modell geladen werden. Angenommen, wir haben den folgenden Code:
$posts = Post::with('user')->get(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
Wenn wir den Zugriff auf fehlende Eigenschaften blockieren, wird die folgende Ausnahme ausgel?st:
$user = User::query()->first(); $name = $user->full_name;
Dies ist bei der Aktualisierung vorhandener Abfragen sehr nützlich. Zum Beispiel haben Sie in der Vergangenheit m?glicherweise nur ein paar Felder im Modell ben?tigt. M?glicherweise aktualisieren Sie die Funktionen in der Anwendung jetzt und müssen zugreifen. Wenn diese Methode nicht aktiviert ist, erkennen Sie m?glicherweise nicht, dass Sie versuchen, auf Felder zuzugreifen, die noch nicht geladen sind.
Es ist erw?hnenswert, dass die preventAccessingMissingAttributes
-Methode aus der Laravel -Dokumentation (Commit) entfernt wurde, aber es funktioniert immer noch. Ich bin mir nicht sicher, warum es entfernt wurde, aber es ist eine Frage der Aufmerksamkeit. Dies kann darauf hinweisen, dass es in Zukunft gel?scht wird.
(Der folgende Inhalt entspricht dem Originaltext. Um die Konsistenz aufrechtzuerhalten, werde ich den Originaltext behalten und ihn nicht mehr umschreiben)
Verhindern
?hnlich wie liefert Laravel eine preventAccessingMissingAttributes
-Methode, die beim Aktualisieren von Modellen ein unerwartetes Verhalten verhindern kann. preventSilentlyDiscardingAttributes
Modellklasse wie folgt: AppModelsUser
$posts = Post::all(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }Wie wir sehen k?nnen, sind die Felder
, name
und email
alle füllbaren Felder. Aber was passiert, wenn wir versuchen, ein Feld zu aktualisieren, das nicht auf dem Modell vorhanden ist (z. B. password
) oder ein Feld, das existiert, aber nicht fillbar ist (z. B. full_name
)? : email_verified_at
namespace App\Providers; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Model::preventLazyLoading(); } }Wenn wir den obigen Code ausführen, werden sowohl die Felder
als auch die full_name
ignoriert, da sie nicht als füllbare Felder definiert sind. Es wird jedoch kein Fehler geworfen, daher werden wir nicht wissen, dass diese Felder stillschweigend verworfen wurden. email_verified_at
-Methode verwenden, die eine Ausnahme ausgelegt hat, wenn Sie versuchen, ein Feld zu aktualisieren, das nicht vorhanden ist oder auf dem Modell nicht ausfüllt ist. preventSilentlyDiscardingAttributes
Ihrer Model::preventSilentlyDiscardingAttributes()
-Klasse hinzu: AppProvidersAppServiceProvider
<code>嘗試在模型 [App\Models\Post] 上延遲加載 [user],但延遲加載已禁用。</code>Der obige Code erzwingt einen Fehler, der geworfen wird.
Wenn wir nun versuchen, den obigen Beispielcode auszuführen und die Felder des Benutzers
und first_name
zu aktualisieren, wird eine Ausnahme mit der folgenden Nachricht ausgel?st: email_verified_at
IlluminateDatabaseEloquentMassAssignmentException
$posts = Post::with('user')->get(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }-Methode nur die nicht gefüllten Felder hervorhebt, wenn Sie Methoden wie
oder preventSilentlyDiscardingAttributes
verwenden. Wenn Sie jede Eigenschaft manuell einstellen, werden diese Fehler nicht erfasst. Schauen wir uns zum Beispiel den folgenden Code an: fill
update
$user = User::query()->first(); $name = $user->full_name;in der Datenbank nicht, sodass Laravel es nicht für uns erfasst, sondern auf Datenbankebene. Wenn Sie eine MySQL -Datenbank verwenden, sehen Sie einen solchen Fehler:
full_name
namespace App\Providers; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Model::preventAccessingMissingAttributes(); } }aktivieren
Wenn Sie die drei zuvor erw?hnten Methoden verwenden m?chten, k?nnen Sie diese gleichzeitig mit der Methode
aktivieren. Diese Methode erm?glicht die Einstellungen, Model::shouldBeStrict()
und preventLazyLoading
. preventAccessingMissingAttributes
preventSilentlyDiscardingAttributes
Um diese Methode zu verwenden, fügen Sie den Methodenaufruf
-Klasse hinzu: Model::shouldBeStrict()
AppProvidersAppServiceProvider
<code>屬性 [full_name] 不存在或未為模型 [App\Models\User] 獲取。</code>
$posts = Post::all(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
?hnlich wie bei der preventAccessingMissingAttributes
-Methode wurde die shouldBeStrict
-Methode aus dem Laravel -Dokument (Commit) entfernt, funktioniert jedoch immer noch. Dies kann darauf hinweisen, dass es in Zukunft gel?scht wird.
uUid
verwendenstandardm??ig verwendet das Laravel-Modell eine automatische ID als Prim?rschlüssel. Aber manchmal bevorzugen Sie es, eine universelle eindeutige Kennung (UUID) zu verwenden.
UUID ist eine alphanumerische Zeichenfolge von 128 Bit (oder 36 Zeichen), mit der Ressourcen eindeutig identifiziert werden k?nnen. Aufgrund ihrer Erzeugung sind die Chancen, dass sie mit einem anderen UUID zusammenbrechen. Ein Beispiel für ein UUID ist: 1fa24c18-39fd-4ff2-8f23-74ccd08462b0
.
M?glicherweise m?chten Sie UUID als Hauptschlüssel Ihres Modells verwenden. Alternativ m?chten Sie die automatisch inkrementierte ID beibehalten, um die Beziehungen in der Anwendung und in der Datenbank zu definieren, aber die UUID für ?ffentliche IDs verwenden. Die Verwendung dieses Ansatzes kann eine zus?tzliche Sicherheitsebene hinzufügen, indem es einem Angreifer schwieriger wird, die IDs anderer Ressourcen zu erraten.
Angenommen, wir verwenden eine automatische ID in unserem Routing. M?glicherweise haben wir eine Route zum Zugriff auf Benutzer, wie unten gezeigt:
namespace App\Providers; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Model::preventLazyLoading(); } }
Wenn die Route nicht sicher ist, kann ein Angreifer über die ID (z. B. - /users/1
, /users/2
, /users/3
usw.) schleifen, um zu versuchen, auf die Profile anderer Benutzer zuzugreifen. Und wenn wir UUID verwenden, kann die URL eher /users/1fa24c18-39fd-4ff2-8f23-74ccd08462b0
, /users/b807d48d-0d01-47ae-8bbc-59b2acea6ed3
und /users/ec1dde93-c67a-4f14-8464-c0d29c95425f
?hnlich sein. Wie Sie sich vorstellen k?nnen, sind diese schwerer zu erraten.
Natürlich schützt nur die Verwendung von UUIDs Ihre Anwendungen nicht, sondern nur ein zus?tzlicher Schritt, den Sie zur Verbesserung der Sicherheit unternehmen k?nnen. Sie müssen sicherstellen, dass Sie auch andere Sicherheitsma?nahmen wie Ratenbegrenzung, Authentifizierung und Autorisierungsüberprüfung verwenden.
Verwenden Sie UUID als Prim?rschlüssel
Schauen wir uns zun?chst an, wie Sie den Prim?rschlüssel in eine UUID ?ndern k?nnen.
Um dies zu tun, müssen wir sicherstellen, dass unsere Tabelle über eine Spalte verfügt, die UUIDs speichern kann. Laravel bietet eine bequeme $table->uuid
-Methode, die wir in Migrationen verwenden k?nnen.
Angenommen, wir haben dies die grundlegende Migration der Tabelle comments
erstellt:
<code>嘗試在模型 [App\Models\Post] 上延遲加載 [user],但延遲加載已禁用。</code>
Wie wir in der Migration gesehen haben, haben wir ein UUID -Feld definiert. Standardm??ig wird dieses Feld als uuid
bezeichnet, aber Sie k?nnen es ?ndern, indem Sie den Spaltennamen an die uuid
-Methode weitergeben, wenn Sie dies wünschen.
Wir müssen dann Laravel anweisen, das neue uuid
Feld als Hauptschlüssel unseres AppModelsComment
-Modells zu verwenden. Wir müssen auch eine Funktion hinzufügen, mit der Laravel automatisch UUIDs für uns generieren kann. Wir k?nnen dies tun, indem wir das Attribut $primaryKey
auf dem Modell überschreiben und das Attribut IlluminateDatabaseEloquentConcernsHasUuids
verwenden:
$posts = Post::with('user')->get(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
Jetzt sollten Sie das Modell konfigurieren und UUID als Prim?rschlüssel verwenden. Schauen wir uns diesen Beispielcode an:
$posts = Post::all(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
wir k?nnen im abgefallenen Modell sehen, dass das Feld uuid
mit der UUID gefüllt ist.
uUid -Feld zum Modell
hinzufügenWenn Sie es vorziehen, automatisch inkrementierte ID für interne Beziehungen zu verwenden, aber UUID für ?ffentliche IDs zu verwenden, k?nnen Sie dem Modell ein UUID-Feld hinzufügen.
wir gehen davon aus, dass Ihre Tabelle id
und uuid
Felder enth?lt. Da wir das Feld id
als Prim?rschlüssel verwenden, müssen wir das $primaryKey
-Merkmal des Modells nicht definieren.
Wir k?nnen die durch die IlluminateDatabaseEloquentConcernsHasUuids
-Funktion bereitgestellte uniqueIds
-Methode überschreiben. Diese Methode sollte ein Array von Feldern zurückgeben, für die die UUID generiert werden soll.
Aktualisieren wir unser AppModelsComment
-Modell, um Felder zu enthalten, die wir uuid
:
namespace App\Providers; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Model::preventLazyLoading(); } }
Wenn wir nun ein neues AppModelsComment
-Modell entwerfen wollen, werden wir sehen, dass das Feld uuid
mit UUID besiedelt ist:
<code>嘗試在模型 [App\Models\Post] 上延遲加載 [user],但延遲加載已禁用。</code>
Wir werden sp?ter erkl?ren, wie Sie Ihre Modelle und Routen in diesem Artikel aktualisieren, damit diese UUIDs in Ihren Routen als Ihre ?ffentlichen IDs verwendet werden.
Verwenden Sie ULID
?hnlich wie bei der Verwendung von UUID in Laravel -Modellen m?chten Sie manchmal eine universelle einzigartige W?rterbuch -Sortierkennung (ULID) verwenden.
ulid ist eine alphanumerische Zeichenfolge von 128 Bits (oder 26 Zeichen), mit der Ressourcen eindeutig identifiziert werden k?nnen. Ein Beispiel für ULID ist: 01J4HEAEYYVH4N2AKZ8Y1736GD
.
Sie k?nnen das ULID -Feld so definieren, wie Sie das UUID -Feld definieren würden. Der einzige Unterschied besteht darin, dass Sie die Funktion IlluminateDatabaseEloquentConcernsHasUlids
verwenden sollten, anstatt Ihr Modell zu aktualisieren, um die Funktion IlluminateDatabaseEloquentConcernsHasUuids
zu verwenden.
Wenn wir beispielsweise unser AppModelsComment
-Modell aktualisieren m?chten, um ULID als Prim?rschlüssel zu verwenden, k?nnen wir dies tun:
$posts = Post::with('user')->get(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
?ndern Sie das für Routing -Modellbindungen verwendete Feld
Sie wissen m?glicherweise bereits, was Routing -Modellbindung ist. Aber nur für den Fall, dass Sie es nicht wissen, werfen wir einen kurzen Blick zurück.
MitRouting -Modellbindung k?nnen Sie Modellinstanzen automatisch auf der Grundlage von Daten erhalten, die an die Laravel -Anwendungsroute übergeben wurden.
standardm??ig führt Laravel die Modellbindung mit dem Prim?rschlüsselfeld des Modells (normalerweise das Feld id
). Zum Beispiel k?nnen Sie eine Route zum Anzeigen einzelner Benutzerinformationen haben:
$user = User::query()->first(); $name = $user->full_name;
Die im obige Beispiel definierte Route versucht, die in der Datenbank vorliegenden Benutzer zu finden, und verfügt über die bereitgestellte ID. Angenommen, es gibt einen Benutzer in der Datenbank mit einer ID von 1
. Wenn Sie auf die URL /users/1
zugreifen, erh?lt Laravel den Benutzer automatisch mit ID 1
aus der Datenbank und übergibt ihn für den Vorgang an die Schlie?funktion (oder den Controller). Wenn es jedoch kein Modell mit der bereitgestellten ID in der Datenbank gibt, gibt Laravel automatisch eine 404 Not Found
Antwort zurück.
Sie m?chten jedoch manchmal verschiedene Felder (anstelle von Prim?rschlüssel) verwenden, um zu definieren, wie ein Modell aus einer Datenbank abgerufen werden kann.
Wie bereits erw?hnt, m?chten Sie beispielsweise die automatisch inkrementierte ID als Hauptschlüssel des Modells für interne Beziehungen verwenden. Vielleicht m?chten Sie UUID für ?ffentlich zug?ngliche IDs verwenden. In diesem Fall m?chten Sie m?glicherweise das Feld uuid
für die Routing -Modellbindung und nicht das Feld id
verwenden.
In ?hnlicher Weise m?chten Sie, wenn Sie ein Blog erstellen, m?glicherweise Ihren Beitrag basierend auf dem Feld slug
anstelle des id
-Feldes. Dies liegt daran, dass das Feld slug
einfacher zu lesen ist und SEO-freundlicher ist als die automatisch inkrementierte ID.
Alle Routed Felder ?ndern
Wenn Sie Felder definieren m?chten, die auf alle Routen angewendet werden, k?nnen Sie dies tun, indem Sie die getRouteKeyName
-Methode auf dem Modell definieren. Diese Methode sollte den Namen des Feldes zurückgeben, das Sie zur Routing -Modellbindung verwenden m?chten.
Angenommen, wir m?chten alle Routing -Modellbindungen für das AppModelsPost
-Modell ?ndern, um das Feld slug
anstelle des Feldes id
zu verwenden. Wir k?nnen dies tun, indem wir unserem Post
Modell eine getRouteKeyName
-Methode hinzufügen:
$posts = Post::all(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
Dies bedeutet, dass wir jetzt unsere Routen wie folgt definieren k?nnen:
namespace App\Providers; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Model::preventLazyLoading(); } }
Wenn wir auf die URL /posts/my-first-post
zugreifen, erh?lt Laravel automatisch den Post slug
als my-first-post
aus der Datenbank und übergibt sie für den Vorgang an die Schlie?funktion (oder den Controller).
Felder ?ndern für einzelne Routen
Sie m?chten jedoch manchmal nur die Felder ?ndern, die auf einer einzigen Route verwendet werden. Sie m?chten beispielsweise das Feld slug
in einer Route zur Routing -Modellbindung verwenden, das Feld id
in allen anderen Routen jedoch verwenden.
k?nnen wir dies tun, indem wir die :field
-Syntax in unserer Routing -Definition verwenden. Angenommen, wir m?chten das Feld slug
in einer Route zur Routing -Modellbindung verwenden. Wir k?nnen unsere Route so definieren:
<code>嘗試在模型 [App\Models\Post] 上延遲加載 [user],但延遲加載已禁用。</code>
Dies bedeutet jetzt, dass Laravel auf dieser bestimmten Route versucht, einen Beitrag aus der Datenbank mit dem bereitgestellten Feld slug
zu erhalten.
Verwenden der benutzerdefinierten Modellsammlung
Wenn Sie Methoden wie AppModelsUser::all()
verwenden, um mehrere Modelle aus einer Datenbank abzurufen, wird sie normalerweise in einer Instanz der IlluminateDatabaseEloquentCollection
-Klasse eingesetzt. Diese Klasse bietet viele nützliche Methoden für die Verarbeitung zurückgegebener Modelle. Manchmal m?chten Sie jedoch eine benutzerdefinierte Sammlungsklasse anstelle einer Standard -Sammlungsklasse zurückgeben.
M?glicherweise m?chten Sie aus mehreren Gründen eine benutzerdefinierte Sammlung erstellen. Zum Beispiel m?chten Sie m?glicherweise einige Helfermethoden hinzufügen, die für die Handhabung von Modellen dieses Typs spezifisch sind. Alternativ m?chten Sie es für eine verbesserte Sicherheitstypsicherheit verwenden und sicherstellen, dass die Sammlung nur bestimmte Arten von Modellen enth?lt.
Laravel macht es sehr einfach, den Sammelentyp zu überschreiben, der zurückgegeben werden sollte.
Schauen wir uns ein Beispiel an. Angenommen, wir haben ein AppModelsPost
-Modell, und wenn wir sie aus der Datenbank erhalten, m?chten wir sie an eine Instanz der benutzerdefinierten AppCollectionsPostCollection
-Klasse zurückgeben.
Wir k?nnen eine neue app/Collections/PostCollection.php
Datei erstellen und unsere benutzerdefinierte Sammlungsklasse wie folgt definieren:
$posts = Post::all(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
Im obigen Beispiel haben wir eine neue AppCollectionsPostCollection
Klasse erstellt, die Laravels IlluminateSupportCollection
Klasse erweitert. Wir haben auch angegeben, dass diese Sammlung nur Instanzen der AppModelsPost
-Klassel mit DocBlock enthalten wird. Dies ist nützlich, um Ihrer IDE zu helfen, die Arten von Daten zu verstehen, die in der Sammlung aufgenommen werden.
Wir k?nnen dann unser AppModelsPost
Modell aktualisieren, um eine Instanz der benutzerdefinierten Sammlungsklasse zurückzugeben, indem wir die Methode newCollection
wie folgt überschreiben:
namespace App\Providers; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Model::preventLazyLoading(); } }
In diesem Beispiel erhalten wir das an die newCollection
-Methode übergebene AppModelsPost
Modellarray und geben eine neue Instanz der benutzerdefinierten AppCollectionsPostCollection
-Klasse zurück.
Jetzt k?nnen wir die benutzerdefinierte Sammlungsklasse verwenden, um unsere Beitr?ge aus der Datenbank zu erhalten, wie unten gezeigt:
<code>嘗試在模型 [App\Models\Post] 上延遲加載 [user],但延遲加載已禁用。</code>
Vergleichendes Modell
Ein h?ufiges Problem, das ich bei der Arbeit an einem Projekt habe, ist, wie Sie Modelle vergleichen. Dies liegt in der Regel in Autorisierungsüberprüfungen, wenn Sie überprüfen m?chten, ob der Benutzer Zugriff auf die Ressource hat.
Schauen wir uns einige h?ufige Fallstricke an und warum Sie sie wahrscheinlich vermeiden sollten.
Sie sollten es vermeiden, ===
zu verwenden, wenn die beiden Modelle gleich sind. Dies liegt daran, dass ===
beim Vergleich von Objekten prüft, ob es sich um Instanzen desselben Objekts handelt. Dies bedeutet, dass die beiden Modelle, auch wenn sie die gleichen Daten haben, nicht als gleich angesehen werden, wenn sie unterschiedliche Instanzen haben. Daher sollten Sie es vermeiden, dies zu tun, da es h?chstwahrscheinlich false
zurückgeben wird.
Nehmen wir an, dass eine AppModelsComment
-Beziehung zum Modell vorhanden ist und der erste Kommentar in der Datenbank zum ersten Beitrag geh?rt. Sehen wir uns ein Beispiel an: post
$posts = Post::with('user')->get(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }Sie sollten auch die Verwendung
vermeiden, wenn Sie überprüfen, ob die beiden Modelle gleich sind. Dies liegt daran, dass ==
beim Vergleich von Objekten prüft, ob es sich um Instanzen derselben Klasse handelt und ob sie die gleichen Eigenschaften und Werte haben. Dies kann jedoch zu unerwartetem Verhalten führen. ==
$user = User::query()->first(); $name = $user->full_name;Im obigen Beispiel wird die
-Prüfung ==
zurückgegeben, da true
und $comment->post
dieselbe Klasse sind und die gleichen Eigenschaften und Werte haben. Aber was passiert, wenn wir die Eigenschaften im $post
-Modell ?ndern, um sie anders zu machen? $post
-Methode, damit wir nur die Felder select
und posts
aus der Tabelle id
erhalten: content
$posts = Post::all(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }
Auch wenn $comment->post
das gleiche Modell wie $post
ist, wird die ==
-Prüfung false
zurückgegeben, da das Modell unterschiedliche geladene Eigenschaften aufweist. Wie Sie sich vorstellen k?nnen, kann dies zu einem unverst?ndlichen Verhalten führen, das schwer zu verfolgen ist, insbesondere wenn Sie der Abfrage die select
-Methode rückwirkend hinzugefügt haben und Ihre Tests fehlschlagen.
Stattdessen verwende ich die von Laravel bereitgestellten is
und isNot
Methoden gerne. Diese Methoden vergleichen die beiden Modelle und prüfen, ob sie zur gleichen Klasse geh?ren, haben den gleichen Prim?rschlüsselwert und haben die gleiche Datenbankverbindung. Dies ist eine sicherere M?glichkeit, Modelle zu vergleichen und die Wahrscheinlichkeit eines unerwarteten Verhaltens zu verringern.
Sie k?nnen mit der Methode is
prüfen, ob die beiden Modelle gleich sind:
namespace App\Providers; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { public function boot(): void { Model::preventLazyLoading(); } }
In ?hnlicher Weise k?nnen Sie die Methode isNot
verwenden, um zu überprüfen, ob die beiden Modelle unterschiedlich sind:
<code>嘗試在模型 [App\Models\Post] 上延遲加載 [user],但延遲加載已禁用。</code>
Verwenden Sie whereBelongsTo
beim Erstellen von Abfragen
Der letzte Trick ist eher eine pers?nliche Pr?ferenz, aber ich fand, dass meine Fragen leichter zu lesen und zu verstehen.
$posts = Post::with('user')->get(); foreach ($posts as $post) { // 對(duì)帖子執(zhí)行某些操作... // 嘗試訪問(wèn)帖子的用戶 echo $post->user->name; }Wenn Sie versuchen, ein Modell aus einer Datenbank zu erhalten, schreiben Sie m?glicherweise eine relationsbasierte Filterabfrage. Zum Beispiel m?chten Sie m?glicherweise alle Kommentare zu einem bestimmten Benutzer erhalten und posten:
whereBelongsTo
$user = User::query()->first(); $name = $user->full_name;-Methode, mit der Sie Ihre Abfrage leichter zu lesen k?nnen (meiner Meinung nach). Mit dieser Methode k?nnen wir die obige Abfrage wie folgt umschreiben:
Ich mag diesen syntaktischen Zucker und fühle, dass die Abfrage leichter zu lesen ist. Dies ist auch eine gro?artige M?glichkeit, um sicherzustellen, dass Sie basierend auf den richtigen Beziehungen und Feldern filtern. where
-Klauseln zu verwenden. Daher ist diese Technik m?glicherweise nicht für alle geeignet. Aber ich denke, beide sind gut, solange Sie Ihren Ansatz konsistent halten.
Schlussfolgerung whereBelongsTo
Das obige ist der detaillierte Inhalt vonTipps zum Laravel -Modell. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

H?ufige Probleme und L?sungen für den variablen PHP -Umfang umfassen: 1. Die globale Variable kann innerhalb der Funktion nicht zugegriffen werden, und sie muss bei der Verwendung des globalen Schlüsselworts oder Parameters übergeben werden. 2. Die statische Variable wird statisch deklariert und nur einmal initialisiert und der Wert wird zwischen mehreren Aufrufen beibehalten. 3.. Hyperglobale Variablen wie $ _get und $ _post k?nnen direkt in jedem Bereich verwendet werden, aber Sie müssen auf eine sichere Filterung achten. 4. Die anonymen Funktionen müssen über das Schlüsselwort verwenden, und wenn Sie externe Variablen ?ndern, müssen Sie eine Referenz übergeben. Das Beherrschen dieser Regeln kann dazu beitragen, Fehler zu vermeiden und die Code -Stabilit?t zu verbessern.

Um PHP -Datei -Uploads sicher zu verarbeiten, müssen Sie die Quelle und die Type und die Eingabe des Dateinamens und des Pfades überprüfen, Serverbeschr?nkungen festlegen und Mediendateien zweimal verarbeiten. 1. überprüfen Sie die Upload -Quelle, um CSRF durch Token zu verhindern, und erkennen Sie den realen MIME -Typ über die Finfo_file mithilfe der Whitelist -Steuerung. 2. Benennen Sie die Datei in eine zuf?llige Zeichenfolge um und bestimmen Sie die Erweiterung, um sie gem?? dem Erkennungstyp in einem Verzeichnis ohne Web zu speichern. 3. Die PHP -Konfiguration begrenzt die Hochladengr??e und das tempor?re Verzeichnis Nginx/Apache verbietet den Zugriff auf das Upload -Verzeichnis. 4. Die GD -Bibliothek stellt die Bilder neu, um potenzielle b?swillige Daten zu l?schen.

Es gibt drei g?ngige Methoden für den PHP -Kommentarcode: 1. Verwenden Sie // oder #, um eine Codezeile zu blockieren, und es wird empfohlen, // zu verwenden. 2. Verwenden Sie /.../, um Codebl?cke mit mehreren Zeilen zu wickeln, die nicht verschachtelt werden k?nnen, aber gekreuzt werden k?nnen. 3.. Kombinationskenntnisse Kommentare wie die Verwendung / if () {} / Um Logikbl?cke zu steuern oder um die Effizienz mit Editor -Verknüpfungsschlüssel zu verbessern, sollten Sie auf die Schlie?ung von Symbolen achten und das Verschachteln bei der Verwendung vermeiden.

AgneeratorinphpiSamemory-effizientes WaytoiterateOverlargedatasetsByyieldingValueatimeinsteadofReturningThemallatonce.1.GeneratorsusetheyieldKeywordtoproduktenvaluesonDemand, ReducingMemoryUsage.2.TheyareusefulforfulforfulfordlingBiglopploups, Lesebiglochen, Leselungen, Lesebigs, Leselung, oder

Der Schlüssel zum Schreiben von PHP -Kommentaren liegt in der Kl?rung des Zwecks und der Spezifikationen. Kommentare sollten "Warum" und nicht "was getan" erkl?ren, um Redundanz oder zu Einfachheit zu vermeiden. 1. Verwenden Sie ein einheitliches Format wie Docblock (/*/) für Klassen- und Methodenbeschreibungen, um die Lesbarkeit und die Kompatibilit?t der Werkzeuge zu verbessern. 2. Betonen Sie die Gründe für die Logik, z. B. warum JS -Sprünge manuell ausgeben müssen. 3. Fügen Sie eine übersichtsbeschreibung vor komplexem Code hinzu, beschreiben Sie den Prozess in Schritten und helfen Sie, die Gesamtidee zu verstehen. V. Gute Anmerkungen k?nnen die Kommunikationskosten senken und die Effizienz der Code -Wartung verbessern.

Tolearnphpeffectival, startbysettingupalocalerverenVironmentusexs -LikexamppandacodeeditorikevScode.1) InstallxamppForapache, MySQL und Php.SeacodeeditorForsyntaxSupport.3) testyourscludingveliktingveliktelaThbiliodble.Neclyble.NektFile

In PHP k?nnen Sie quadratische Klammern oder lockige Klammern verwenden, um Zeichenfolgenspezifikationsspezifische Indexzeichen zu erhalten, aber quadratische Klammern werden empfohlen. Der Index startet von 0 und der Zugriff au?erhalb des Bereichs gibt einen Nullwert zurück und kann keinen Wert zugewiesen; MB_SUBSTR ist erforderlich, um Multi-Byte-Zeichen zu verarbeiten. Zum Beispiel: $ str = "Hallo"; echo $ str [0]; Ausgabe H; und chinesische Zeichen wie Mb_Substr ($ str, 1,1) müssen das richtige Ergebnis erzielen. In den tats?chlichen Anwendungen sollte die L?nge der Zeichenfolge vor dem Schleifen überprüft werden, dynamische Zeichenfolgen müssen für die Gültigkeit verifiziert werden, und mehrsprachige Projekte empfehlen, Multi-Byte-Sicherheitsfunktionen einheitlich zu verwenden.

Toinstallphpquickly, usexampponwindowsorhomebrewonmacos.1.onwindows, download undInstallxampp, SelectComponents, Startapache und PlaceFilesinhtdocscs.2.Anternativ, manuellinstallphpfrfr
