国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Inhaltsverzeichnis
entdecken und verhindern Sie N 1 Probleme
Eigenschaften, um den Zugriff auf fehlende
Wenn Sie die drei zuvor erw?hnten Methoden verwenden m?chten, k?nnen Sie diese gleichzeitig mit der Methode
uUid
Verwenden Sie UUID als Prim?rschlüssel
uUid -Feld zum Modell
Verwenden Sie ULID
?ndern Sie das für Routing -Modellbindungen verwendete Feld
Alle Routed Felder ?ndern
Felder ?ndern für einzelne Routen
Verwenden der benutzerdefinierten Modellsammlung
Vergleichendes Modell
Verwenden Sie whereBelongsTo
-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.
Heim Backend-Entwicklung PHP-Tutorial Tipps zum Laravel -Modell

Tipps zum Laravel -Modell

Mar 05, 2025 pm 04:44 PM

Laravel Model Tips

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

Angenommen, Sie haben eine

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

Wie Sie erwartet haben, kann dies schwer zu findende Fehler in der Anwendung verursachen, insbesondere wenn in Ihrer "Update" -Anweisung tats?chlich aktualisiert wurde. Daher k?nnen wir die

-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

Um diese Methode zu verwenden, fügen Sie den Methodenaufruf

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

Es ist erw?hnenswert, dass die
$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

im obigen Code existiert das Feld
$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

strenge Modus des Modells
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

Ihrer

-Klasse hinzu: Model::shouldBeStrict() AppProvidersAppServiceProvider

Dies entspricht:
<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

verwenden

standardm??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ügen

Wenn 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:

nennen
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.

Mit

Routing -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. ==

Sehen Sie sich dieses Beispiel an:

$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

verwenden wir die

-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

laravel bietet eine
$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

Sie oder Ihr Team k?nnen es vorziehen, einen expliziteren Ansatz zum Schreiben von

-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

Ich hoffe, dieser Artikel zeigt Ihnen einige neue Tipps für die Verwendung von Laravel -Modellen. Sie sollten nun in der Lage sein, N 1 -Probleme zu entdecken und zu verhindern, den Zugang zu fehlenden Eigenschaften zu verhindern, die Eigenschaften stillschweigend abzuwagen und den Prim?rschlüsseltyp in UUID oder ULID zu ?ndern. Sie sollten auch wissen, wie Sie die für Routing -Modellbindungen verwendeten Felder ?ndern, die Art der zurückgegebenen Sammlung angeben, das Modell vergleichen und beim Erstellen der Abfrage verwenden.

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!

Erkl?rung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Hei?e KI -Werkzeuge

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

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

Hei?e Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Hei?e Themen

PHP-Tutorial
1502
276
Variabler PHP -Bereich erkl?rt Variabler PHP -Bereich erkl?rt Jul 17, 2025 am 04:16 AM

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.

Wie behandle ich Datei -Uploads sicher in PHP? Wie behandle ich Datei -Uploads sicher in PHP? Jul 08, 2025 am 02:37 AM

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.

Code in PHP aus dem Code ausgehen Code in PHP aus dem Code ausgehen Jul 18, 2025 am 04:57 AM

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.

Wie arbeiten Generatoren in PHP? Wie arbeiten Generatoren in PHP? Jul 11, 2025 am 03:12 AM

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

Tipps zum Schreiben von PHP -Kommentaren Tipps zum Schreiben von PHP -Kommentaren Jul 18, 2025 am 04:51 AM

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.

PHP lernen: Ein Anf?ngerführer PHP lernen: Ein Anf?ngerführer Jul 18, 2025 am 04:54 AM

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

So greifen Sie in einer Zeichenfolge nach Index in PHP auf ein Zeichen zu So greifen Sie in einer Zeichenfolge nach Index in PHP auf ein Zeichen zu Jul 12, 2025 am 03:15 AM

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.

SchnellpHP -Installations -Tutorial SchnellpHP -Installations -Tutorial Jul 18, 2025 am 04:52 AM

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

See all articles