黑马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模式)的更多相关文章

  1. 黑马lavarel教程---10、lavarel模型关联

    黑马lavarel教程---10.lavarel模型关联 一.总结 一句话总结: 1.模型关联比较方便,一次定义,后面都可以使用 2.关联关系 使用动态属性进行调用 1.一对多,多对多实例? 一对多: ...

  2. 黑马lavarel教程---9、缓存操作

    黑马lavarel教程---9.缓存操作 一.总结 一句话总结: legend2项目中自己写的哪些文件操作都可以通过这里的缓存实现,简单方便 1.lavarel中如何使用后端主流的缓存如 Memcac ...

  3. 黑马lavarel教程---13、分页

    黑马lavarel教程---13.分页 一.总结 一句话总结: - lavarel里面的分页操作和tp里面的分页操作几乎是一模一样的 - 控制器:$data=Lesson::paginate(2); ...

  4. 黑马lavarel教程---7、文件上传

    黑马lavarel教程---7.文件上传 一.总结 一句话总结: 在laravel里面实现文件的上传是很简单的,压根不用引入第三方的类库,作者把上传作为一个简单的http请求看待的. 1.在lavar ...

  5. 黑马lavarel教程---6、简单验证

    黑马lavarel教程---6.简单验证 一.总结 一句话总结: 1.验证的最简单实例:$request的validate方法,验证通过可以继续进行,验证失败就重定向 2.中文提示可以用中文语言包 3 ...

  6. 黑马lavarel教程---1、lavarel目录结构

    黑马lavarel教程---1.lavarel目录结构 一.总结 一句话总结: 一套视频讲的东西太少,要看多套视频 1.安装lavarel需要额外开启的模块? extension=php_filein ...

  7. 黑马lavarel教程---2、获取用户输入

    黑马lavarel教程---2.获取用户输入 一.总结 一句话总结: lavarel中获取用户输入可以通过Input外观模式和Request外观模式,两者的对应的方法啥的都一样,比如get.all.o ...

  8. 黑马lavarel教程---12、lavarel验证码

    黑马lavarel教程---12.lavarel验证码 一.总结 一句话总结: 用插件的时候仔细看插件的版本要求 1.lavarel安装验证码插件的时候,如果(可选)需要定义自己的配置,则需要生成配置 ...

  9. 黑马lavarel教程---11、响应处理

    黑马lavarel教程---11.响应处理 一.总结 一句话总结: 如果在昂扬状态,看学习视频和运动时间重合,会很舒服 1.jquery的$.post参数为什么不需要占位? 因为每个参数的类型不同,可 ...

随机推荐

  1. app hellocharts 柱状图

    app里有个告警数量的柱状图,有点小问题,y轴竟然不是整数 这个改起来到是简单 Axis yAxis = new Axis().setHasLines(true).setTextColor(Color ...

  2. RAD Studio 10.3.2七大新功能介绍

    RAD Studio 10.3.2七大新功能 Delphi支持macOS 64位应用的开发. C++Builder中Windows 64位平台支持C ++ 17特性. C ++ LSP 代码洞察改进. ...

  3. Action向视图传值的6种方式(转)

    在使用ASP.NET MVC进行项目开发时,经常会碰到从Action向视图传值的问题,今天我就把我所知道的方式总结了一下,分成了以下六种: 1.使用ViewData进行传值 在Action中,有如下代 ...

  4. html中onclick传的数字不对的原因

    在html中数字16位以后传输的时候都是0,改成字符串就可以了

  5. Migrating authentication of Samba from smbpasswd to tdb

    Was addicted various After you upgrade the OS of old Samba server. Put it also was using a set of 2. ...

  6. python函数:装饰器、修正、语法糖、有参装饰器、global与nonlocal

    一.装饰器 二.装饰器修正1 三.装饰器修正2 四.装饰器的语法糖 五.有参.无参装饰器 六.global与nonlocal 一.装饰器 ''' 1 什么是装饰器 器=>工具 装饰=>指的 ...

  7. Hadoop_06_Hadoop的HDFS的概念和特性

    1.HDFS的概念和特性 1.1. 首先,它是一个文件系统,用于存储文件,通过统一的命名空间——目录树来定位文件 1.2. 它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色:重 ...

  8. Linux用户组管理及用户权限4

    权限管理:    ls -l        rwxrwxrwx:            左三位:定义user(owner)的权限            中三位:定义group的权限           ...

  9. Diagonal Walking v.2 CodeForces - 1036B (思维,贪心)

    Diagonal Walking v.2 CodeForces - 1036B Mikhail walks on a Cartesian plane. He starts at the point ( ...

  10. SQL Server中四类事务并发问题的实例再现(转)

    本篇文章将用实例再现数据库访问中四类并发问题,希望能让初学者能对事务的并行性有进一步的理解. 首先,让我们先来了解一下并行问题以及事务隔离级别这两个概念.在数据库中,假设如果没有锁定且多个用户同时访问 ...