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!
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.
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);
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); }
full_name
im Post-Modell zugreifen: User::latest()->first()->full_name;
$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...);
这将节省你在控制器中进行计算的时间,你可以简单地使用不存在的列,并在执行某些计算时使用变异器
protected $with = [];
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 < zu verwenden code>duration_in_hours. Nach dieser Logik nennen wir es im Controller so: User::all()->pluck('id');
Mutatoren< verwenden, wenn Sie bestimmte Berechnungen/Code> 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><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">User::all()->pluck(&#39;id&#39;)->toArray();</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div></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. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">$comments = Comment::with(&#39;user&#39;)->get();
foreach ($comments as $comment) {
echo $comment->user->name;
}</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>这会以两个查询结束。第一个查询获取所有注释,第二个查询立即获取所有关联用户。在后台,会发生以下情况(简化版SQL):</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><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><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>不论是 10、500 还是 10000 条评论数据都不重要,我们都依旧只执行两次SQL查询。</p><p>好了,你现在已经看到如何使用渴求式加载了。但只限于如何手动使用。你还可以将整个过程自动化,以便某些关联关系总是自动通过渴求式方式加载。为此,需要给模型设定一个属性。</p><div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false;">protected $with = [];</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div><p>我们可以在<code>Comment
model简单设置 protected $with = ['user'];
, 从现在起,user
在任何时候都会自动加载。我们还有很多种渴求式加载,有仅加载特定列、嵌套即时加载、多个即时加载等等。更多详情请Laravel文档或深入核心。
有的时候需要查询所有的主键 ID, 查询是否复杂并不重要,大多数人可能会像这样做:
User::all()->pluck('id');
这个操作很 nice,但是返回的是一个集合,想要转换成数组的话可以使用 toArray()
。
User::all()->pluck('id')->toArray();
大多数情况下,上面的操作的可以简化成这样:
User::all()->modelKeys();
这种方式返回一个数组。重要的是这个方法并不会总是返回 id
。 顾名思义,他是以数组的形式返回所有模型主键。主键默认是id
,同时也可以在模型中定义主键名。
protected $primaryKey = 'id';
原文地址: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!