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 !
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.
L'attribut de nom de serpent est un attribut intéressant. Voyons ce que dit le code :
/** * 指示是否在数组上使用蛇形大小写属性。 * * @var bool */ public static $snakeAttributes = true;
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.
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);
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;
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); }
现在你可以访问post模型上的full_name
属性,如下:
User::latest()->first()->full_name;
如果返回对象(如集合),则此属性不会附加到用户模型。将protected$appends
属性添加到模型中。它接受一个数组,其中包含一个或多个字段,从现在起应该自动追加这些字段。写成这样就可以了:
protected $appends = ['full_name'];
变异器与获取器相反。你可以用它做些很有意思的事情。 举个例子,转换不同类型的输入。 让我来给你详细说说。假设你想要保存一种类型的时间段。通常,你总是保存尽可能小的单位。在我们的案例中是秒。由于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; } }
上述代码意味着你可以使用一个不存在于数据表本身的字段。
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'), ]); } }
这将节省你在控制器中进行计算的时间,你可以简单地使用不存在的列,并在执行某些计算时使用变异器
$comments = Comment::all(); foreach ($comments as $comment) { echo $comment->user->name; }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; }
$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...);Ajoutez un mutateur (définisseur de propriétés) pour les colonnes inexistantesLes 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 = [];Le code ci-dessus signifie que vous pouvez utiliser un champ qui n'existe pas dans la table de données elle-même.
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 durée_en_heures. Selon cette logique, nous l'appelons ainsi dans le Controller : User::all()->pluck('id');Cela vous fera gagner du temps lors des calculs dans le contrôleur, vous pouvez simplement utiliser des colonnes inexistantes et utiliser des
mutateurs 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 : 🎜<pre class="brush:php;toolbar:false;">User::all()->pluck(&#39;id&#39;)->toArray();</pre>🎜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. 🎜<pre class="brush:php;toolbar:false;">$comments = Comment::with(&#39;user&#39;)->get();
foreach ($comments as $comment) {
echo $comment->user->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文档或深入核心。
有的时候需要查询所有的主键 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视频教程】
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!