Heim  >  Artikel  >  PHP-Framework  >  6 Laravel Eloquent-Tipps, die Ihnen helfen, die Lesbarkeit des Codes zu verbessern!

6 Laravel Eloquent-Tipps, die Ihnen helfen, die Lesbarkeit des Codes zu verbessern!

青灯夜游
青灯夜游nach vorne
2022-11-15 20:07:231755Durchsuche

In diesem Artikel werden sechs Laravel Eloquent-Tipps zusammengestellt und geteilt, die die Lesbarkeit des Codes verbessern können. Ich hoffe, dass er für alle hilfreich ist!

6 Laravel Eloquent-Tipps, die Ihnen helfen, die Lesbarkeit des Codes zu verbessern!

Eloquent ist das von Laravel standardmäßig verwendete ORM. Der aktive Aufnahmemodus wird verwendet. Ermöglicht Ihnen eine einfachere Interaktion mit der Datenbank. Jedes einzelne Modell stellt eine Tabelle in der Datenbank dar, die Sie bearbeiten können. In diesem Artikel zeigen wir Ihnen mehr oder weniger versteckte Geheimnisse, Methoden und Eigenschaften, die Sie möglicherweise nicht kennen, um Ihren Code zu verbessern.

Schlangenbenennungsattribut

Das Schlangenbenennungsattribut ist ein interessantes Attribut. Schauen wir uns an, was der Code sagt:

/**
 * 指示是否在数组上使用蛇形大小写属性。
 *
 * @var bool
 */
public static $snakeAttributes = true;

Menschen verwenden diese Eigenschaft oft fälschlicherweise, um die Art und Weise zu ändern, wie auf die Eigenschaft zugegriffen wird. Viele Leute glauben, dass Sie, wenn Sie diese Eigenschaft ändern, mithilfe von CamelCase-Anmerkungen problemlos auf die Eigenschaft zugreifen können. Dies ist nicht der Fall. Wir empfehlen Ihnen dringend, es nicht zu verwenden. Wenn das Modell als Array ausgegeben wird, definieren Sie einfach, ob das Attribut „camelCase“ oder „SnakeCase“ sein soll.

Wenn Sie Ihre Namensgebung auf camelCase basieren möchten, empfehlen wir Ihnen, sich das Paket „Eloquence“ von Kirk Bushell von Kirk Bushell anzusehen. Es bietet eine sofort einsatzbereite Paginierungsmethode. Vielleicht kennen Sie das:

$comments = Comment::paginate(20);
Mit dieser Methode können Sie das Kommentarmodell mit 20 Einträgen pro Seite paginieren. Ändern Sie diesen Wert, um zu definieren, wie viele Elemente pro Seite angezeigt werden. Wenn nichts angegeben wird, wird der Standardwert angewendet, der 15 ist.

Angenommen, Sie möchten Bewertungen an mehreren Stellen auf Ihrer Website anzeigen. Es gibt immer 30 Kommentare pro Seite. Wenn Sie überall Parameter 30 übergeben müssen, ist das ein Problem. Daher können Sie neue Standardwerte direkt am Modell festlegen.

protected $perPage = 30;

Benutzerdefinierte Werte im Modell hinzufügen

Eloquent verfügt über eine leistungsstarke Funktion namens „Accessor“. Mit dieser Funktion können Sie dem Modell benutzerdefinierte Felder oder Tabellen hinzufügen, die im Modell nicht vorhanden sind. Es spielt keine Rolle, ob Sie einen vorhandenen Wert verwenden oder einen völlig neuen Wert definieren, Sie können jederzeit zurückgreifen. Nachfolgend finden Sie ein Beispiel für die Funktionsweise des Accessors. Angenommen, es gibt ein Modell mit dem Namen user, dann fügen wir einen FullName-Accessor hinzu:

function getFullNameAttribute() {
    return sprintf('%s %s', $this->first_name, $this->last_name);
}

Jetzt können Sie wie folgt auf das Attribut full_name im Post-Modell zugreifen:
User::latest()->first()->full_name;
Wenn ein Objekt zurückgegeben wird (wie eine Sammlung), wird diese Eigenschaft nicht an das Benutzermodell angehängt. Fügen Sie dem Modell das protected$appends-Attribut hinzu. Es akzeptiert ein Array mit einem oder mehreren Feldern, die von nun an automatisch angehängt werden sollten. Schreiben Sie es einfach so:

protected $appends = ['full_name'];

Fügen Sie einen Mutator (Eigenschaftssetzer) für nicht vorhandene Spalten hinzuuser的模型,我们给他添加一个FullName的访问器:

class Video extends Model
{
    public function setDurationInMinutes($value)
    {
        $this->attributes['duration_in_seconds'] = $value * 60;
    }

    public function setDurationInHours($value)
    {
        $this->attributes['duration_in_seconds'] = $value * 60 * 60;
    }
}

现在你可以访问post模型上的full_name属性,如下:

class AnyController
{
    public function store()
    {
        $video->update([
            'title' => request('title'),
            'duration_in_minutes' => request('duration_in_minutes'),
        ]);
    }
}

如果返回对象(如集合),则此属性不会附加到用户模型。将protected$appends属性添加到模型中。它接受一个数组,其中包含一个或多个字段,从现在起应该自动追加这些字段。写成这样就可以了:

$comments = Comment::all();
foreach ($comments as $comment) {
    echo $comment->user->name;
}

为不存在列增加一个变异器(属性设置器)

变异器与获取器相反。你可以用它做些很有意思的事情。 举个例子,转换不同类型的输入。 让我来给你详细说说。假设你想要保存一种类型的时间段。通常,你总是保存尽可能小的单位。在我们的案例中是秒。由于UX的原因,用户不想输入秒,例如在一个地方输入分钟,或者在另一个地方输入小时。这一切都可以很快解决。

$comments = Comment::with('user')->get();
foreach ($comments as $comment) {
    echo $comment->user->name;
}

上述代码意味着你可以使用一个不存在于数据表本身的字段。
model中使用的是duration_in_minutes字段,但是在后台,我们使用duration_in_seconds进行更新,也有可能使用一个不存在字段duration_in_hours。根据这个逻辑,我们在Controller如此调用:

SELECT id, user_id, body FROM comments;
SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);

这将节省你在控制器中进行计算的时间,你可以简单地使用不存在的列,并在执行某些计算时使用变异器

Mutatoren sind das Gegenteil von Gettern. Man kann damit wirklich interessante Dinge machen. Konvertieren Sie beispielsweise verschiedene Arten von Eingaben. Lassen Sie mich es Ihnen im Detail erzählen. Angenommen, Sie möchten einen bestimmten Zeitraum speichern. Generell speichern Sie immer die kleinstmöglichen Einheiten. In unserem Fall sind es Sekunden. Aus UX-Gründen möchten Benutzer keine Sekunden wie Minuten an einer Stelle oder Stunden an einer anderen eingeben. Das lässt sich alles schnell lösen.

protected $with = [];

Der obige Code bedeutet, dass Sie ein Feld verwenden können, das in der Datentabelle selbst nicht vorhanden ist.
Das Feld duration_in_minutes wird im Modell verwendet, aber im Hintergrund verwenden wir duration_in_seconds zum Aktualisieren, oder es ist möglich, ein nicht vorhandenes Feld duration_in_hours. Nach dieser Logik nennen wir es im Controller so:

User::all()->pluck('id');

Dadurch sparen Sie Zeit bei Berechnungen im Controller. Sie können einfach nicht vorhandene Spalten verwenden und Mutatoren durchführen Ordnen Sie die Ergebnisse den richtigen Feldern zu. <p></p>Eager Loading: mit $mit<p></p>Reden wir über Beziehungen. Standardmäßig verwendet Laravel Lazy Loading. Was bedeutet das im Hinblick auf Beziehungen? Der Vorteil des verzögerten Ladens besteht darin, dass Speicher gespart werden kann, da nicht alle Daten beibehalten werden müssen und wir Daten bei Bedarf laden können. Wie folgt: <p><pre class="brush:php;toolbar:false;">User::all()-&gt;pluck(&amp;#39;id&amp;#39;)-&gt;toArray();</pre></p>Im obigen Beispiel erhalten wir alle Kommentardaten. Anschließend werden die Kommentare durchlaufen und der Benutzername für jeden Kommentar angezeigt. An diesem Code ist nichts auszusetzen und er funktioniert einwandfrei, aber wir sind auf ein Problem gestoßen. Lazy Loading stellt nun sicher, dass die Abfrage zum Abrufen des Benutzers nur dann ausgeführt wird, wenn wir den Benutzernamen ausgeben möchten. 🎜🎜Willkommen zu Ihrer ersten N+1-Frage. Warum N+1? N ist immer die Anzahl der Bewertungen und 1 ist die Abfrage, um die Bewertungen zu erhalten. Wenn wir beispielsweise 500 Bewertungen haben, wird die Abfrage zum Abrufen aller Bewertungen einmal ausgelöst und dann eine Abfrage zum Abrufen der entsprechenden Bewertungen pro Benutzer. Also 500+1 Abfrage. Das bedeutet, dass mit zunehmender Anzahl der Anmerkungen auch die Anzahl der Abfragen zunimmt. 🎜🎜Um dies zu verhindern, gibt es eine Methode namens Eager Loading. 🎜<pre class="brush:php;toolbar:false;">$comments = Comment::with(&amp;#39;user&amp;#39;)-&gt;get(); foreach ($comments as $comment) { echo $comment-&gt;user-&gt;name; }</pre><p>这会以两个查询结束。第一个查询获取所有注释,第二个查询立即获取所有关联用户。在后台,会发生以下情况(简化版SQL):</p><pre class="brush:php;toolbar:false;">SELECT id, user_id, body FROM comments; SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);</pre><p>不论是 10、500 还是 10000 条评论数据都不重要,我们都依旧只执行两次SQL查询。</p> <p>好了,你现在已经看到如何使用渴求式加载了。但只限于如何手动使用。你还可以将整个过程自动化,以便某些关联关系总是自动通过渴求式方式加载。为此,需要给模型设定一个属性。</p><pre class="brush:php;toolbar:false;">protected $with = [];</pre><p>我们可以在<code>Comment model简单设置 protected $with = ['user'];, 从现在起,user在任何时候都会自动加载。

我们还有很多种渴求式加载,有仅加载特定列、嵌套即时加载、多个即时加载等等。更多详情请Laravel文档或深入核心。

modelKeys 方法

有的时候需要查询所有的主键 ID, 查询是否复杂并不重要,大多数人可能会像这样做:

User::all()->pluck(&#39;id&#39;);

这个操作很 nice,但是返回的是一个集合,想要转换成数组的话可以使用 toArray()

User::all()->pluck(&#39;id&#39;)->toArray();

大多数情况下,上面的操作的可以简化成这样:

User::all()->modelKeys();

这种方式返回一个数组。重要的是这个方法并不会总是返回 id。 顾名思义,他是以数组的形式返回所有模型主键。主键默认是id,同时也可以在模型中定义主键名。

protected $primaryKey = &#39;id&#39;;

原文地址:https://laravel-news.com/6-eloquent-secrets

译文地址:https://www.php.cn/link/c7decb5ce28209911b545d0b1059c5e3

【相关推荐:laravel视频教程

Das obige ist der detaillierte Inhalt von6 Laravel Eloquent-Tipps, die Ihnen helfen, die Lesbarkeit des Codes zu verbessern!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen