@作者 : SYFStrive
@博客首页 : HomePage
📜: THINK PHP
📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗
📌:觉得文章不错可以点点关注 👉:专栏连接🔗
👉 VUEJS(🔥) 👉 MYSQL(🔥) 👉 微信小程序(🔥) 👉 PHPMYSQL(🔥) 👉 UNIAPP开发(🔥)
目录
- PHP LARAVEL 简介
- PHP LARAVEL 模型的作用域
- 本地作用域
- 全局作用域
- PHP LARAVEL 模型的访问器和修改器
- 访问器
- 修改器
- 最后
⡖⠒⠒⠒⠤⢄⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸ ⠀⠀⠀⡼⠀⠀⠀⠀ ⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢶⣲⡴⣗⣲⡦⢤⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⠋⠉⠉⠓⠛⠿⢷⣶⣦⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠘⡇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡞⠀⠀⠀⠀⠀⠀⠀⢰⠇⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡴⠊⠉⠳⡄⠀⢀⣀⣀⡀⠀⣸⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠰⠆⣿⡞⠉⠀⠀⠉⠲⡏⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠈⢧⡀⣀⡴⠛⡇⠀⠈⠃⠀⠀⡗⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⣱⠃⡴⠙⠢⠤⣀⠤⡾⠁⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⣇⡼⠁⠀⠀⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⣸⢠⣉⣀⡴⠙⠀⠀⠀⣼⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⡏⠀⠈⠁⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠀⠀⠀⠀⠀⡼⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⣰⠃⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣀⠤⠚⣶⡀⢠⠄⡰⠃⣠⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⣠⠔⣋⣷⣠⡞⠀⠉⠙⠛⠋⢩⡀⠈⠳⣄⠀⠀⠀⠀⠀⠀⠀
⠀⡏⢴⠋⠁⠀⣸⠁⠀⠀⠀⠀⠀ ⠀⣹⢦⣶⡛⠳⣄⠀⠀⠀⠀⠀
⠀⠙⣌⠳⣄⠀⡇ 不能 ⡏⠀⠀ ⠈⠳⡌⣦⠀⠀⠀⠀
⠀⠀⠈⢳⣈⣻⡇ 白嫖 ⢰⣇⣀⡠⠴⢊⡡⠋⠀⠀⠀⠀
⠀⠀⠀⠀⠳⢿⡇⠀⠀⠀⠀⠀⠀⢸⣻⣶⡶⠊⠁⠀⠀
⠀⠀⠀⠀⠀⢠⠟⠙⠓⠒⠒⠒⠒⢾⡛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⣠⠏⠀⣸⠏⠉⠉⠳⣄⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⡰⠃⠀⡴⠃⠀⠀⠀⠀⠈⢦⡀⠈⠳⡄⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣸⠳⣤⠎⠀⠀⠀⠀⠀⠀⠀⠀⠙⢄⡤⢯⡀⠀⠀⠀⠀⠀⠀
⠀⠐⡇⠸⡅⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡆⢳⠀⠀⠀⠀⠀⠀
⠀⠀⠹⡄⠹⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣇⠸⡆⠀⠀⠀⠀⠀
⠀⠀⠀⠹⡄⢳⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⡀⣧⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢹⡤⠳⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣷⠚⣆⠀⠀⠀⠀
⠀⠀⠀⡠⠊⠉⠉⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡎⠉⠀⠙⢦⡀⠀
⠀⠀⠾⠤⠤⠶⠒⠊⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠒⠲⠤⠽
提示:以下是本篇文章正文内容
PHP LARAVEL 简介
- Laravel是一种流行的开源PHP Web应用程序框架,由Taylor Otwell在2011年创建并发布。它提供了一个简洁优雅的语法和丰富的功能集,旨在使Web开发过程更快速、简单和愉悦。
-
MVC架构模式:Laravel采用了MVC(Model-View-Controller)架构模,将应用程序的逻辑分为不同的层,提高了代码的可维护性和可测试性。
-
简洁的语法和表达力:Laravel框架支持具有简洁而表达力的语法,使得编写清晰、易读、易维护的代码成为可能。
-
路由系统:它提供了一个强大且灵活的路由系统,通过简单的配置和代码即可定义Web应用程序的路由规则,实现URL到控制器的映射。
-
数据库抽象层:Laravel提供了一个简便的数据库抽象层,支持多种数据库系统,并通过Eloquent ORM提供了一种优雅的方法来与数据库进行交互。
-
权限和认证系统:Laravel提供了内置的身份验证和授权功能,使得实现用户身份验证、访问控制和权限管理变得简单和便捷。
-
缓存系统:Laravel支持多种缓存后端,包括文件、数据库、Memcached和Redis等,让你可以轻松地实现缓存数据,提升应用程序的性能。
-
强大的扩展性:Laravel通过Composer和Packagist等工具提供了丰富的扩展包生态系统,可以快速集成各种功能组件和第三方库,加快开发进程。
-
测试支持:Laravel鼓励编写和运行测试,提供了一套丰富的测试工具和断言,帮助开发者确保代码的质量和可靠性。
- 总的来说,Laravel框架以其易用性、优雅的语法、丰富的功能和强大的扩展性受到了广大开发者的喜爱。它提供了
PHP LARAVEL 模型的作用域
本地作用域
- 很多情况下,我们在数据查找时有一部分条件会被重复且
大量使用
; - 而这个条件,可能只是在这个模型对应的数据表使用,别的表并不使用;
- 那么这种情况,可以使用
本地作用域的方式
,将常用的 SQL 封装起来
; - 如 👉 用户模块中,我们大量查询需要查询性别为男,且其它条件的;
eg 👇
public function index()
{
$result = Book::where('price', '>', 18.8)
->get();
return $result;
}
eg : 我们可以将性别为男
这个片段,封装成一个单独的方法,然后统一在这个模型下调用;
// namespace App\http\models;
//本地作用域,搜索自动添加为“金币大于18.8”的条件
//语法:scope 开头,后面名称尽可能包含语义
public function scopePrice($query)
{
return $query->where('price', '>', '18.8');
}
//使用 👇
class BookModelController extends Controller
{
public function index()
{
$result = Book::price()
->get();
return $result;
}
}
- 上面的方法比较死板,适合简单粗暴,如果想要灵活多变,支持传递参数;
//参数可以是 1 个或多个
public function index()
{
$result = Book::price(18.8,'小黑子')
->get();
return $result;
}
//参数 2 和 3,接受控制器传递过来的 1,2
public function scopePrice($query, $price, $name)
{
return $query->where('price', '>', $price)->where('name', $name);
}
全局作用域
- 全局作用域,顾名思义就是在
任意
地方都可以有效的封装条件; - 比如有个需求,不管在哪里操作,
总是显示 价格大于18.8
的数据; - 首先在
app
目录下创建一个用于全局作用域的目录:Scopes
; - 创建一个用于设置
价格大于18.8
的全局作用域的类,它需要实现 scope 接口
;
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Scope;
class BookPrice implements Scope
{
public function apply(Builder $builder, Model $model)
{
return $builder->where('price', '>', 18.8);
}
}
- 此时,还不能实现全局,因为需要在模型设置个开关,让其富有灵活性;
//启用全局作用域
protected static function booted()
{
parent::booted(); // TODO: Change the autogenerated stub
static::addGlobalScope(new BookPrice());
}
eg:而在控制器端,并不需要做任何设置,即可自动添加 价格大于18.8
的条件;
前后数据对比 👇
eg 前
eg 后
- 当然,如果这个全局只是针对某个模块,并不需要创建一个全局类,直接闭包即可;
protected static function booted()
{
//Builder 命名空间 👉 use Illuminate\Database\Eloquent\Builder;
parent::booted(); // TODO: Change the autogenerated stub
static::addGlobalScope('price',function (Builder $builder){
return $builder->where('price', '>', 18.8);
});
}
eg:注意 Builder 引入的文件和全局类引入的文件一致,如果引入别的同名类会错;
- 如果某个查询,并不需要这个全局条件,可以单独移出掉;
//取消名称为 price 的全局
$result = Book::withoutGlobalScope('price')->get();
//取消全局类的条件
$result = Book::withoutGlobalScope(BookPrice::class)->get();
eg:还有 withoutGlobalScopes([])方法,传递参数取消多个全局;
PHP LARAVEL 模型的访问器和修改器
访问器
- 访问器:就是在获取数据列表时,
拦截属性并对属性进行修改
的过程; - 比如,我们在输出
名字
时,在名字左右加上括号,或给邮件转换为大写;
访问器,前固定
get
,后固定Attribute
,name
是字段名
//访问器,前固定 get,后固定 Attribute,Gender 是字段名
//参数$value 是源字段值,可修改返回
public function getNameAttribute($value): string
{
return '[' . $value . ']';
}
eg:如果字段名是两个单词中间是下划线:user_name,那么方法名:
getUserNameAttribute()
eg 👇
- 我们也可以创建一个虚拟字段,用已有的数据字段进行整合,不过要进行数据追加;
//将虚拟字段追加到数据对象列表里去
protected $appends = ['info'];
//创建一个虚拟字段
public function getInfoAttribute()
{
return $this->name.' 价格:'.$this->price;
}
PS:注意,如果 price 之前已经有访问器修改过,上面的方法会得到修改过的结果:
PS:如果要使用源字段进行创建虚拟字段,需要使用下面这种:
return $this->attributes['username'].'-'.$this->attributes['gender'];
访问器修改过字段进行创建虚拟字段 eg 👇
源字段进行创建虚拟字段 eg 👇
修改器
- 修改器定义
//修改器,写入数据时,将邮箱转换为大写
public function setNameAttribute($value)
{
$this->attributes['name'] = strtoupper($value);
}
- 修改器,相对于访问器,是在
写入的时候拦截
,进行修改再写入
;
//修改器,写入数据时,将 姓名 转换为大写
public function index()
{
$result = Book::create(['user_id' => 1, 'name' => 'xiaoming']);
$result->save();
return $result;
}
eg 👇
- 可以添加默认的日期列,默认 created_at 和 updated_at;
//设置可以自动写入日期的列
protected $dates = [
'details' //哪个字段以 日期 写入
];
- 可以设置字段输出的类型,比如设置一个布尔型,输出时就是 true 和 false;
//设置字段类型
protected $casts = [
'details' => 'boolean' //哪个字段以 布尔 写入
];
最后
以上是个人学习 THINKPHP 的相关知识点,一点一滴的记录了下来,有问题请评论区指正,共同进步,这才是我写文章的原因之,如果这篇文章对您有帮助请三连支持一波