Maison > cadre php > Laravel > le corps du texte

6 astuces Laravel Eloquent pour vous aider à améliorer la lisibilité du code !

青灯夜游
Libérer: 2022-11-15 20:08:01
avant
1863 Les gens l'ont consulté

Cet article compile et partage six conseils Laravel Eloquent qui peuvent améliorer la lisibilité du code. J'espère qu'il sera utile à tout le monde !

6 astuces Laravel Eloquent pour vous aider à améliorer la lisibilité du code !

Eloquent est l'ORM utilisé par Laravel par défaut. Le mode d'enregistrement actif est utilisé. Vous permet d’interagir plus facilement avec la base de données. Chaque modèle individuel représente une table de la base de données sur laquelle vous pouvez opérer. Dans cet article, nous allons vous montrer des secrets, des méthodes et des propriétés plus ou moins cachées que vous ignorez peut-être pour améliorer votre code.

Attribut de nom de serpent

L'attribut de nom de serpent est un attribut intéressant. Voyons ce que dit le code :

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

Les gens utilisent souvent cette propriété de manière incorrecte pour modifier la façon dont on y accède. Beaucoup de gens pensent que si vous modifiez cette propriété, vous pouvez facilement y accéder à l'aide des annotations camelCase. Ce n'est pas le cas. Nous vous déconseillons fortement de l'utiliser. Lorsque le modèle est généré sous forme de tableau, définissez simplement si l'attribut doit être camelCase ou SnakeCase.

Si vous souhaitez baser votre nom sur camelCase, nous vous recommandons de consulter le package de Kirk Bushell Eloquence de Kirk Bushell.

Pagination

Si vous utilisez l'ORM éloquent de Laravel, alors c'est une bonne nouvelle pour vous. Il fournit une méthode de pagination prête à l'emploi. Vous connaissez peut-être l'écriture comme ceci :

$comments = Comment::paginate(20);
Copier après la connexion

En utilisant cette méthode, vous pouvez paginer le modèle de commentaire avec 20 entrées par page. Modifiez cette valeur pour définir le nombre d'éléments affichés par page. Si rien n'est spécifié, la valeur par défaut est appliquée, qui est 15.

Supposons que vous souhaitiez afficher les avis à plusieurs endroits de votre site Web. Il y a toujours 30 commentaires par page. Si vous devez passer le paramètre 30 partout, c'est un problème. Vous pouvez donc définir de nouvelles valeurs par défaut directement sur le modèle.

protected $perPage = 30;
Copier après la connexion

Ajoutez des valeurs personnalisées dans le modèle

Eloquent possède une fonctionnalité puissante appelée "accesseur". Cette fonctionnalité vous permet d'ajouter des champs personnalisés au modèle ou des tables qui n'existent pas dans le modèle. Peu importe que vous utilisiez une valeur existante ou que vous en définissiez une complètement nouvelle, vous pouvez toujours revenir en arrière. Vous trouverez ci-dessous un exemple du fonctionnement de l'accesseur. Supposons qu'il existe un modèle nommé user, nous y ajoutons un accesseur FullName :user的模型,我们给他添加一个FullName的访问器:

function getFullNameAttribute() {
    return sprintf('%s %s', $this->first_name, $this->last_name);
}
Copier après la connexion

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

User::latest()->first()->full_name;
Copier après la connexion

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

protected $appends = ['full_name'];
Copier après la connexion

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

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

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;
    }
}
Copier après la connexion

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

class AnyController
{
    public function store()
    {
        $video->update([
            'title' => request('title'),
            'duration_in_minutes' => request('duration_in_minutes'),
        ]);
    }
}
Copier après la connexion

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

$comments = Comment::all();
foreach ($comments as $comment) {
    echo $comment->user->name;
}
Copier après la connexion

Vous pouvez maintenant accéder à l'attribut full_name sur le modèle de publication, comme suit :

$comments = Comment::with('user')->get();
foreach ($comments as $comment) {
    echo $comment->user->name;
}
Copier après la connexion
Copier après la connexion

Si un objet est renvoyé (comme une collection), cette propriété ne sera pas attachée au modèle utilisateur. Ajoutez l'attribut protected$appends au modèle. Il accepte un tableau contenant un ou plusieurs champs, qui devraient désormais être automatiquement ajoutés. Écrivez-le simplement comme ceci :

SELECT id, user_id, body FROM comments;
SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);
Copier après la connexion
Copier après la connexion

Ajoutez un mutateur (définisseur de propriétés) pour les colonnes inexistantes

Les mutateurs sont l'opposé des getters. On peut faire des choses vraiment intéressantes avec. Par exemple, convertissez différents types d’entrée. Laissez-moi vous le dire en détail. Supposons que vous souhaitiez enregistrer un type de période. Généralement, vous enregistrez toujours les plus petites unités possibles. Dans notre cas, ce sont des secondes. Pour des raisons UX, les utilisateurs ne souhaitent pas saisir de secondes, comme des minutes à un endroit ou des heures à un autre. Tout cela peut être résolu rapidement.

protected $with = [];
Copier après la connexion
Copier après la connexion

Le code ci-dessus signifie que vous pouvez utiliser un champ qui n'existe pas dans la table de données elle-même.
Le champ duration_in_minutes est utilisé dans le modèle, mais en arrière-plan, on utilise duration_in_seconds pour mettre à jour, ou il est possible d'utiliser un champ inexistant < code>durée_en_heures. Selon cette logique, nous l'appelons ainsi dans le Controller :

User::all()->pluck(&#39;id&#39;);
Copier après la connexion
Copier après la connexion

Cela vous fera gagner du temps lors des calculs dans le contrôleur, vous pouvez simplement utiliser des colonnes inexistantes et utiliser des mutateurs< lors de l'exécution de certains calculs /code> Mappez ses résultats sur les champs corrects. 🎜🎜Chargement impatient : avec $with🎜🎜Parlons de relations. Par défaut, Laravel utilise le chargement paresseux. Qu’est-ce que cela signifie en termes de relations ? L'avantage du chargement différé est qu'il permet d'économiser de la mémoire, car toutes les données n'ont pas besoin d'être conservées et nous pouvons charger des données en cas de besoin. Comme suit : 🎜<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()-&gt;pluck(&amp;#39;id&amp;#39;)-&gt;toArray();</pre><div class="contentsignin">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div>🎜Dans l'exemple ci-dessus, nous obtiendrons toutes les données des commentaires. Parcourt ensuite les commentaires et affiche le nom d'utilisateur pour chaque commentaire. Il n'y a rien de mal avec ce code et il fonctionne bien, mais nous avons rencontré un problème. Le chargement paresseux garantit désormais que la requête pour obtenir l'utilisateur n'est exécutée que lorsque nous voulons afficher le nom d'utilisateur. 🎜🎜Bienvenue à votre première question N+1. Pourquoi N+1 ? N est toujours le nombre d'avis et 1 est la requête permettant d'obtenir les avis. Par exemple, si nous avons 500 avis, la requête pour obtenir tous les avis est déclenchée une fois, puis une requête pour obtenir les avis utilisateur correspondants. Donc 500+1 requête. Cela signifie que plus le nombre d’annotations augmente, plus le nombre de requêtes augmente. 🎜🎜Pour éviter cela, il existe une méthode appelée chargement impatient. 🎜<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(&amp;#39;user&amp;#39;)-&gt;get(); foreach ($comments as $comment) { echo $comment-&gt;user-&gt;name; }</pre><div class="contentsignin">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</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">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</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">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div><p>我们可以在<code>Comment model简单设置 protected $with = [&#39;user&#39;];, 从现在起,user在任何时候都会自动加载。

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

modelKeys 方法

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

User::all()->pluck(&#39;id&#39;);
Copier après la connexion
Copier après la connexion

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

User::all()->pluck(&#39;id&#39;)->toArray();
Copier après la connexion
Copier après la connexion

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

User::all()->modelKeys();
Copier après la connexion

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

protected $primaryKey = &#39;id&#39;;
Copier après la connexion

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

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

【相关推荐:laravel视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:learnku.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal