本篇文章整理分享六个能提高代码可读性的 Laravel Eloquent 小技巧,希望对大家有所帮助!
Eloquent是Laravel默认使用的ORM。采用了活动记录模式。让你可以以一种更加轻松的方式与数据库进行交互。每个单独的模型都表示数据库中的一个表,你可以使用该表进行操作。在这篇文章中,我们将或多或少地向你展示你可能不知道的隐藏秘密、方法和属性,以改进你的代码。
蛇形命名 属性
蛇形命名属性是一个有趣的属性。让我们看看代码是怎么说的:
/** * 指示是否在数组上使用蛇形大小写属性。 * * @var bool */ public static $snakeAttributes = true;
人们经常会错误地使用这个属性来更改访问属性的方式。许多人认为,如果更改这个属性,就可以使用驼峰式注释轻松访问属性。事实并非如此。我们强烈建议你不要使用它。当模型作为数组输出时,只需定义属性是驼峰式还是蛇形即可。
如果你想基于驼峰式命名,我们建议你查看 Kirk Bushell 的软件包 Eloquence by Kirk Bushell.
分页
如果你正在使用 Laravel 的 Eloquent ORM,那这对你是个好消息。 它提供了一种开箱即用的分页方法。你可能很熟悉这样的写法:
$comments = Comment::paginate(20);
使用此方法,你可以每页20个条目来为 comment model 分页。更改该值可以定义每页显示多少条数。如果不指定任何内容,则应用默认值,即15。
假设您希望在网站上的多个位置显示评论。每页总是有30条评论。如果必须在每个地方传递参数30,那就麻烦了。因此,您可以直接在模型上设置新的默认值。
protected $perPage = 30;
在model里面增加自定义值
Eloquent有一个称为“访问器”的强大功能。该功能允许你向模型或表中不存在的模型添加自定义字段。使用现有的值或定义全新的值都不重要,随时都可以回退。下面是访问器如何工作的示例。假设有一个名为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'), ]); } }
这将节省你在控制器中进行计算的时间,你可以简单地使用不存在的列,并在执行某些计算时使用变异器
将其结果映射到正确的字段上。
渴求式加载: with $with
让我们来谈谈关联关系。默认情况下,Laravel使用延迟加载。就关联关系而言,这意味着什么?延迟加载的好处是可以节省内存,因为并不是所有的数据都需要保留,我们可以在需要的时候加载数据。如下:
$comments = Comment::all(); foreach ($comments as $comment) { echo $comment->user->name; }
在上面的例子中,我们会获取所有评论数据。然后遍历评论并显示每个评论的用户名。这段代码没什么问题,可以正常工作,但我们遇到了一个问题。延迟加载现在确保仅当我们想要输出用户名时才执行获取用户的查询。
欢迎来到你的第一个 N+1 问题。为什么是 N+1?N 始终是评论的数量,1 是获取评论的查询。例如,如果我们有500个评论,那么获取所有评论的查询被触发一次,然后一个查询获得相应的user-per评论。所以500+1查询。这意味着随着注释数量的增加,查询的数量也会增加。
为了防止出现这种情况,有一种称为渴求式加载的方法。
$comments = Comment::with('user')->get(); foreach ($comments as $comment) { echo $comment->user->name; }
这会以两个查询结束。第一个查询获取所有注释,第二个查询立即获取所有关联用户。在后台,会发生以下情况(简化版SQL):
SELECT id, user_id, body FROM comments; SELECT name FROM users WHERE user_id IN (1,2,3,4,5...);
不论是 10、500 还是 10000 条评论数据都不重要,我们都依旧只执行两次SQL查询。
好了,你现在已经看到如何使用渴求式加载了。但只限于如何手动使用。你还可以将整个过程自动化,以便某些关联关系总是自动通过渴求式方式加载。为此,需要给模型设定一个属性。
protected $with = [];
我们可以在Comment
model简单设置 protected $with = ['user'];
, 从现在起,user
在任何时候都会自动加载。
我们还有很多种渴求式加载,有仅加载特定列、嵌套即时加载、多个即时加载等等。更多详情请Laravel文档或深入核心。
modelKeys 方法
有的时候需要查询所有的主键 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视频教程】
以上是6个Laravel Eloquent小技巧,助你提高代码可读性!的详细内容。更多信息请关注PHP中文网其他相关文章!

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3 英文版
推荐:为Win版本,支持代码提示!

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

SublimeText3 Linux新版
SublimeText3 Linux最新版