笔记 · · 247 阅读

Laravel model 模型用法和部分问题解方法

https://blog.csdn.net/qq_43233225/article/details/127514752

Laravel model 模型用法和部分问题解方法

一. Laravel 简介

Laravel 是PHP Web开发框架,说到Laravel就肯定得提到Eloquent ORM1 。

Eloquent 模型类对应着数据库中的一张表,反向控制容器(IoC container)提供了生成新对象、随时实例化对象、访问单例(singleton)对象的便捷方式。反向控制(IoC)类似于Java中的控制反转思想。

我的理解就是相当于Java中的对象,将数据表作为一个对象,进行调用里面的属性和相关方法。

二. Laravel model 介绍

ORM 2两种最常见的实现方式是 ActiveRecord 和 DataMapper,ActiveRecord 尤其流行,在很多框架中都能看到它的身影。两者的区别主要在于 ActiveRecord 中模型与数据表一一对应,而 DataMapper 中模型与数据表是完全分离的。

Laravel 中的 Eloquent ORM 使用的也是 ActiveRecord 实现方式,每一个 Eloquent 模型类对应着数据库中的一张表,我们通过调用模型类中相应方法实现对数据库的增删改查。

这个模型类我们就称它为 model。

三. Laravel model 模型基本属性,用法介绍

  1. 定义模型

创建后的文件会放在app目录下的Models目录下

php artisan make:model ModelName

如果你想要在生成模型时生成数据库迁移,可以使用–migration 或-m 选项:

php artisan make:model User -m

php artisan make:model User --migration

  1. 设置关联的数据表的名称

Eloquent模型的对应表名 默认规则是模型类名的复数作为与其对应的表名,除非在模型类中明确指定了其它名称,在model中定义。

//设置model关联对应名称表名,如不设置,默认为ModelName的复数形式

protected $table = 'table_name';

  1. 设置关联的数据表的主键信息

Eloquent 默认每张表的主键名为id ,你可以在模型类中定义一个$primaryKey 属性来覆盖该约定,

通过$keyType设置主键类型,$incrementing 设置是否自增

//设置主键默认字段

protected $primaryKey = 'primaryKeyName';

// 设置主键的字段类型

protected $keyType = 'String';

// 设置主键是否自增

public $incrementing = false;

  1. created_at 和 updated_at时间字段

默认情况下于数据表中,Eloquent 会自动管理 created_at 和 updated_at字段 。如果数据表没有这两个字段,保存数据时 Model::create($arrayOfValues); 会看到 SQL error,原因就是Laravel 在自动填充 created_at updated_at 的时候,无法找到这两个字段。所以我们不想要这Laravel自动管理,就需要在模型类中将$timestamps 属性设置为false。

// 时间字段是否自动管理

public $timestamps = false;

如果你需要自定义时间戳格式,设置模型中的$dateFormat 属性,该属性决定日期存储到数据库中格式。

//设置格式,默认为 'Y-m-d H:i:s'格式

protected $dateFormat = 'U';

如果数据库中字段与Laravel预设名称不同,处理方法:

// 统一名称

const CREATED_AT = 'create_time';

const UPDATED_AT = 'modify_time';

四. Laravel model 模型常用方法

1.获取该对象所有记录

// 获取模型中全部数据

$models= Models::all();

  1. 访问列值

// 获取模型中的一列

$models->name;

  1. 调用查询方法,执行数据库查询操作

DB数据查询方式

在介绍模型之前,顺带提一下,DB数据查询方式:

*$data= DB::select('select from table_name');**

//查询构造器

$data= DB::table('table_name')->get();

//以上两种查询结果是对象,直接使用return不能输出需要进行处理

//方法一

return response()->json($data);

//方法二

return [$data];

模型查询方式

使用 Eloquent ORM 模型来操作数据库,相较于传统方法,模型查询方式可以很方便的为我们的查询语句添加全局条件,以及查询结果的数据处理,这两个功能我们在后面模块里再做介绍,这部分先介绍一些常用的查询方法:

//laravel 模型查询总结

Model::find(id); //查找主键为id)

Model::find([key1,key2]); //使用双主键进行查找

Model::findOrFail(id); //查找主键为id的数据,找不到抛出异常

Model::whereNotNull('name')->get();//查找name字段不为空

Model::where('id',$id)−>first(); //获取id为id的第一条数据

Model::where('id',$id)->get(); //获取id为id的数据

Model::where('id',$id)−> exists( ); //查询id为id的数据是否存在

Model::where('id',$id)−>pluck('name',' id' )−> first() //查询id为$id的第一个结果的id和name ,[id=>name]

Model::select('id','name')->first();//只查询第一个结果的id和name字段

Model::selectRaw('id' , 'name' as '姓名')->first();//查询id,name 作为姓名字段展示,selectRaw()里面可以使用原生sql语句

Model::whereIn('id',[1,2,3])->get(); //whereIn查询数组范围内的内容

Model::whereRaw("id in (1,2,3)")->get();//whereRaw查询字符串类型用逗号隔开,类似于原生写法

Model::whereBetween('id',[1,3]);//whereBetween查询两个数中间范围内的内容

Model::whereId($id) −>get();//动态属性查找id为id的数据

Model::paginate(10);//分页

//关联查询

Model::with('relation')->get();//将关联数据一起查出来

Model::with('relation:relation.id,relation.name')->get();//只查找关联数据的id,name字段

Model::whereHas('relation',function($query){ ... })->get();//1对多关联,查找关联数据符合条件的数据

Model::whereNotExists(function($query){

  $query->from('relation_table')->where('');

})->get();//查找不符合条件的数据

Model::withCount(['marks as marks_avg'=>function($query){

  $query->select(DB::raw("avg(grade) as makrs_avg"))

}])->orderBy('marks_avg','desc')->paginate(10);

//根据关联数据的平均分排序,将avg()改为max,sum,min,可以实现其他排序

五. model模型在作用域范围内进行数据库查询语句预处理

在没有学习作用域查询之前我们想要验证某个字段是否符合要求,比方说经常用到的是否有效,通过判断delete_time是否为空,那么我们就需要在每条查询中增加

//首先拼接相应字段非空之后再拼接其他条件查询

$model = Model::whereNotNull('delete_time')->get();

全局作用域

当在一定范围内或特定条件下的所有查询都需要增加同样的查询条件时,我们就可以在全局或者局部作用域下进行查询,对上面的传统方法进行优化

通过全局作用域类实现

要实现「全局作用域」,首先需要编写一个实现 Illuminate\Database\Eloquent\Scope 接口的全局作用域类,这里我们将其命名为 DeleteTimeScope ,并将其放到 app/Scopes 目录下:

0 评论

评论

还没有评论,来说两句吧