黑马lavarel教程---5、模型操作(AR模式)
黑马lavarel教程---5、模型操作(AR模式)
一、总结
一句话总结:
AR: ActiveRecord :Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录。
1、Eloquent ORM:用模型操作数据库?
ORM是对象关系模型
eloquent:英 ['eləkwənt]:adj. 意味深长的
英 ['eləkwənt] 美 ['ɛləkwənt]
adj. 意味深长的;雄辩的,有口才的;有说服力的;动人的
[ 比较级 more eloquent 最高级 most eloquent ]
2、Laravel 自带的 Eloquent ORM 介绍?
美观、简单的与数据库打交道:Eloquent ORM 提供了一个【美观、简单】的与数据库打交道的 ActiveRecord 实现,每张数据表都对应一个与该表进行交互的“Model模型”,模型允许你在表中进行数据查询,以及插入、更新、删除等操作。
3、AR模式三个核心(映射)?
1、每个【数据表】:与数据表进行交互的Model【模型】映射(实例化模型)
2、记录中的【字段】:与模型类的【属性】映射(给属性赋值)
3、表中的每个【记录】:与一个完整的请求实例映射(具体的CURD操作)
4、定义模型注意事项?
第一:(必做)定义一个$table属性,值是不要前缀的表名,如果不指定则使用类名的复数形式作为表名。如果模型为Member模型在不指定table属性的情况下,其默认会去找members表。修饰词:protected
第二:(可选)定义$primaryKey属性,值是主键名称,如果需要使AR模式的find方法,则可能需要指定主键(Model::find(n)),在主键字段不是id的时候则需要指定主键。修饰词:protected
第三: (可选)定义$timestamps属性,值是false,如果不设置为false,则默认会操作表中的created_at和updated_at字段,我们表中一般没有这两个字段,所以设置为false,表示不要操作这两个字段。修饰词:public
第四:(可选)定义$fillable属性,表示使用模型插入数据时,允许插入到数据库的字段信息。修饰词:protected
class Member extends Model{
//定义模型关联的数据表(一个模型只操作一个表)
protected $table='member';
//定义主键(可选)
protected $primaryKey=‘id';
//定义禁止操作时间
public $timestamps=false;
//设置允许写入的数据字段
protected $fillable=['id','name','age','email];
}
5、模型定义时候的$fillable字段和$guarded字段的关系:protected $fillable=['id','name','age','email];?
相反:$fillable允许入库的字段,使用$guarded是设置排除入库的字段
6、使用模型中create插入数据时需要注意什么:比如向数据表中添加数据:$result=$model->create($request->all());?
要设置$fillable允许入库的字段,使用$guarded是设置排除入库的字段
7、模型的使用:模型在控制器中的使用方式有2种?
①直接像使用DB门面一样的操作方式:以调用静态方法为主的形式,该形式下模型不需要实例化,例如:Member::get() 等价于 DB::table(‘member’) -> get();
②实例化模型然后再去使用模型类(普通):例如:$model = new Member();$model -> get();
8、Member::get() 和 DB::table(‘member’) -> get()的关系?
等价于:Member::get() 等价于 DB::table(‘member’) -> get();
9、AR模式三个核心映射 实例?
1、$member = new Member(); //映射关系1:将表映射到模型
2、$member-> name = value; //映射关系2:将字段映射到属性
3、$member -> save(); //映射关系3:将记录映射到实例
每个【数据表】:与数据表进行交互的Model【模型】映射(实例化模型)
记录中的【字段】:与模型类的【属性】映射(给属性赋值)
表中的每个【记录】:与一个完整的请求实例映射(具体的CURD操作) 注意:在laravel里面添加数据的时候,需要先实例化模型,然后为模型设置属性,最后调用save方法即可。
$member = new Member(); //映射关系1:将表映射到模型
$member-> name = value; //映射关系2:将字段映射到属性,属性名和字段名一致
$member -> age = value;
…
$member -> save(); //映射关系3:将记录映射到实例
10、模型增加数据操作两种方法?
1、使用AR模式:$member = new Member(); $member-> name = value; $member -> save();
2、Member::create($request->all())
11、Member::all() 和 Member::get()的区别(都查询多行并且指定字段) ?
all不支持连接其他的辅助查询方法:Member::where('id','>',2)->all([' 列 1',' 列 2']); 会报错
12、在laravel里面使用ORM模型方式更新数据需要怎么做?
麻烦:两次操作数据库:需要先调用模型的find方法获取对应的记录,返回一个模型对象,然后为该模型对象设置要更新的数据(对象的属性),最后调用save方法即可。
$user = User::find($id);
$user->title = $_POST['title'];
$user->content= $_POST['content'];
return $user->save() ? 'OK' : 'fail';
13、在laravel里面使用ORM模型方式更新数据时,save并没有指定操作的是哪条记录,为什么save可以准确操作?
|||-begin
$user = User::find($id);
$user->title = $_POST['title'];
$user->content= $_POST['content'];
return $user->save() ? 'OK' : 'fail';
|||-end
模型调用对象一般是单例模式,所以前面User::find($id)的时候模型就是指定的这条数据,所以save的时候更新的也就是这条数据
14、模型使用update方式更新?
$result=Member::where('id','7')->update(['age'=>82']);
二、模型操作(AR模式)
Laravel 自带的 Eloquent ORM 提供了一个美观、简单的与数据库打交道的 ActiveRecord 实现,每张数据表都对应一个与该表进行交互的“Model模型”,模型允许你在表中进行数据查询,以及插入、更新、删除等操作。
AR模式三个核心(映射):
每个数据表 与数据表进行交互的Model模型映射(实例化模型)
记录中的字段 与模型类的属性映射(给属性赋值)
表中的每个记录 与一个完整的请求实例映射(具体的CURD操作)
1、定义模型
(1)定义位置
定义模型的位置,默认是在app目录下面,但是为了管理方便,建议分目录进行创建:
(2)命名规则
本身laravel对模型的命名没有严格的要求,一般采用 表名(首字母大写).php
比如:Member.php User.php Goods.php
(3)创建模型
可以使用artisan命令;
[project] > php artisan make:model Home/Member
创建好的初始代码:
(4)定义模型注意事项(重点);
第一:(必做)定义一个$table属性,值是不要前缀的表名,如果不指定则使用类名的复数形式作为表名。如果模型为Member模型在不指定table属性的情况下,其默认会去找members表。修饰词:protected
第二:(可选)定义$primaryKey属性,值是主键名称,如果需要使AR模式的find方法,则可能需要指定主键(Model::find(n)),在主键字段不是id的时候则需要指定主键。修饰词:protected
第三: (可选)定义$timestamps属性,值是false,如果不设置为false,则默认会操作表中的created_at和updated_at字段,我们表中一般没有这两个字段,所以设置为false,表示不要操作这两个字段。修饰词:public
第四:(可选)定义$fillable属性,表示使用模型插入数据时,允许插入到数据库的字段信息。修饰词:protected
注意:使用模型中create插入数据时,要设置$fillable允许入库的字段,使用$guarded是设置排除入库的字段。
2、模型控制器中调用
引入Member模型类;
模型的使用:模型在控制器中的使用方式有2种
①直接像使用DB门面一样的操作方式:以调用静态方法为主的形式,该形式下模型不需要实例化,例如:Member::get() 等价于 DB::table(‘member’) -> get();
②实例化模型然后再去使用模型类(普通)
例如:$model = new Member();$model -> get();
3、定义测试路由
路由可以使用路由群组的方式进行定义。
4、基本操作
(1)添加数据
在laravel里面完成数据的添加可以使用两种方式:
方式一(AR模式):使用AR模式必须要实例化模型
注意:在laravel里面添加数据的时候,需要先实例化模型,然后为模型设置属性,最后调用save方法即可。
$member = new Member(); //映射关系1:将表映射到模型
$member-> name = value; //映射关系2:将字段映射到属性,属性名和字段名一致
$member -> age = value;
…
$member -> save(); //映射关系3:将记录映射到实例
如果模型中不去关联数据表,则会报以下的错误:
上面的这种方法可以完成数据的插入,但是不建议使用。我们可以使用laravel提供的更高级的操作。
方式二:
建立简易表单,表单中有姓名、年龄、邮箱的字段,要求能够提交
首先,在控制器文件引入Request这个类
use Illuminate\Http\Request;
Request类的使用:
①对象传递
②request语法(与input门面有点类似,方法名一致,但是input调用的是静态方法,而当前的不是)
$request->all()
$request->input('name');
$request->only([‘name1’,’name2’…])
$request->except([‘name1’,’name2’…])
$request->has(‘name’)
$request->get(‘name’)
添加操作代码语法如下;
Member::create($request->all())//返回值是一个对象
注意:如果使用create方法,则需要在模型中定义fillable属性,允许写入字段的定义,如果没有时间相关字段也需要禁用时间自动更新功能:
执行的结果:
(2)查询操作
获取指定主键的一条数据
$info = Member::find(4); // 静态方法调用,获取主键为4的数据
其结果集默认是一个对象。
如果需要在laravel中对象的结果集转化成数组,则需要在最终添加方法的调用:
-> get() -> toArray();
所以刚才的案例,如需要数组结果,则可以写成:
$data = Member::find(4) -> toArray();
获取符合指定条件的第一条记录
Member::where("id",'>',4)->first();
查询多行并且指定字段
Member::all()
Member::all([字段1,字段2]) //与get方法的区别,all不支持连接其他的辅助查询方法
相当于get方法
Member::get()
Member::get([字段1,字段2])
按条件查询指定多个字段
Member::where('id','>',2)->get([' 列 1',' 列 2']); //数组选列
Member::where('id','>',2)->select('列1','列2')->get(); //字符串选列
Member::where('id','>',2)->select( [' 列 1',' 列 2'] )->get(); //字符串选列
案例:测试在all方法之前,写一些辅助方法实现连贯操作
(3)修改数据
注意:在laravel里面如果需要更新数据(ORM模型方式),需要先调用模型的find方法获取对应的记录,返回一个模型对象,然后为该模型对象设置要更新的数据(对象的属性),最后调用save方法即可。
例如:
$user = User::find($id);
$user->title = $_POST['title'];
$user->content= $_POST['content'];
return $user->save() ? 'OK' : 'fail';
案例:实现ORM形式模型的修改操作。修改为7 的用户的邮箱地址为admin@itcast.cn
在AR模式中,更新操作的save并没有指定操作的是哪条记录,为什么save可以准确操作
模型调用对象一般是单例模式,所以前面Member::find(7)的时候模型就是指定的这条数据,所以save的时候更新的也就是这条数据
问题:能不能用模型去update呢?
答:可以使用update方法进行更新,也可以使用AR模式的方式进行更新。
(4)删除数据
注意:在laravel里面如果要删除数据,如果需要使用AR模式删除数据必须先根据主键id查询对应的记录,返回一个模型对象,然后调用模型对象的delete方法即可。
例如代码:
$user = User::find($id);
return $user->delete() ? 'ok' : 'fail';
案例:使用AR模式删除id为7的记录
问题:DB里面的删除方式能否在模型中使用?【可以】
黑马lavarel教程---5、模型操作(AR模式)的更多相关文章
- 黑马lavarel教程---10、lavarel模型关联
黑马lavarel教程---10.lavarel模型关联 一.总结 一句话总结: 1.模型关联比较方便,一次定义,后面都可以使用 2.关联关系 使用动态属性进行调用 1.一对多,多对多实例? 一对多: ...
- 黑马lavarel教程---9、缓存操作
黑马lavarel教程---9.缓存操作 一.总结 一句话总结: legend2项目中自己写的哪些文件操作都可以通过这里的缓存实现,简单方便 1.lavarel中如何使用后端主流的缓存如 Memcac ...
- 黑马lavarel教程---13、分页
黑马lavarel教程---13.分页 一.总结 一句话总结: - lavarel里面的分页操作和tp里面的分页操作几乎是一模一样的 - 控制器:$data=Lesson::paginate(2); ...
- 黑马lavarel教程---7、文件上传
黑马lavarel教程---7.文件上传 一.总结 一句话总结: 在laravel里面实现文件的上传是很简单的,压根不用引入第三方的类库,作者把上传作为一个简单的http请求看待的. 1.在lavar ...
- 黑马lavarel教程---6、简单验证
黑马lavarel教程---6.简单验证 一.总结 一句话总结: 1.验证的最简单实例:$request的validate方法,验证通过可以继续进行,验证失败就重定向 2.中文提示可以用中文语言包 3 ...
- 黑马lavarel教程---1、lavarel目录结构
黑马lavarel教程---1.lavarel目录结构 一.总结 一句话总结: 一套视频讲的东西太少,要看多套视频 1.安装lavarel需要额外开启的模块? extension=php_filein ...
- 黑马lavarel教程---2、获取用户输入
黑马lavarel教程---2.获取用户输入 一.总结 一句话总结: lavarel中获取用户输入可以通过Input外观模式和Request外观模式,两者的对应的方法啥的都一样,比如get.all.o ...
- 黑马lavarel教程---12、lavarel验证码
黑马lavarel教程---12.lavarel验证码 一.总结 一句话总结: 用插件的时候仔细看插件的版本要求 1.lavarel安装验证码插件的时候,如果(可选)需要定义自己的配置,则需要生成配置 ...
- 黑马lavarel教程---11、响应处理
黑马lavarel教程---11.响应处理 一.总结 一句话总结: 如果在昂扬状态,看学习视频和运动时间重合,会很舒服 1.jquery的$.post参数为什么不需要占位? 因为每个参数的类型不同,可 ...
随机推荐
- 第二十四篇 jQuery 学习6 删除元素
jQuery 学习6 删除元素 上节课我们做了添加元素,模拟的是楼主发的文章,路人评论,那么同学们这节课学了删除之后,去之前的代码上添加一个删除,模拟一个楼主删除路人的评论. jQuery的删除方 ...
- 分布式缓存系统 Memcached 快速入门
Memcached介绍 官网地址 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提 ...
- Delphi 使用Query组件的SQL查询
樊伟胜
- PAT Basic 1021 个位数统计 (15 分)
给定一个 k 位整数 1 (0, ,, dk−1>0),请编写程序统计每种不同的个位数字出现的次数.例如:给定 0,则有 2 个 0,3 个 1,和 1 个 3. 输入格式: 每个输入包含 ...
- LabVIEW中的波形图表(Chart)与波形图(Graph)
在百度上随便找的一个简单的例子: 具体链接:https://jingyan.baidu.com/article/5552ef47deb996518ffbc983.html 波形图表最先出现数据,等待所 ...
- CSS基础学习-10.CSS伸缩盒(老版本)
- Java中两个Long对象如何比较是否相等
学java的都知道8种基本类型,知道Long和long的区别,前者定义的是对象,后者定义的是long类型的变量. 但是今天在比较两个Long类型值的时候碰到一个坑,如下: 问题如下 Long a = ...
- C# 学习第二天笔记
1. Convert 类型转换 数据类型不兼容的需要转换时,使用Convert转换.转成什么类型就to谁 例: string--> int string a=“b” Int c= Conver ...
- Chrome安卓H5调试,连接手机检测不到页面
Chrome安卓H5调试,连接手机检测不到页面,重启什么的都不行,未找到设备,或者offline,怎么办? 首先手机开启调试模式是必须的 然后用adb工具箱,cmd进来 运行命令 adb kill-s ...
- lnmp环境搭建(Ubuntu)
dpkg -l | grep gcc ubuntu系统查看已安装的包 dpkg -S nginx 查看安装的nginx apt-get update 首先更新 ...