ORM模型简介

1>什么是ORM?
ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 业务对象时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法即可。
2>ORM 两种最常见的实现方式是 ActiveRecord 和 DataMapper,
ActiveRecord(非常流行) 中模型与数据表一一对应,
DataMapper 中模型与数据表是完全分离的。
3>Eloquent ORM 使用 ActiveRecord 实现方式,每一个 Eloquent 模型类对应着数据库中的一张表,我们通过调用模型类的相应方法实现对数据库的增删改查。

一.定义模型

1.1创建model模型
1>模型通常放在 app 目录中,不过你可以将他们随意放在任何可通过 composer.json 自动加载的地方。(我们建议在app下建立models文件夹)
2>所有的 Eloquent 模型都继承自 Illuminate\Database\Eloquent\Model 类。
3>创建模型实例的最简单方法是使用 make:model artisan命令
php artisan make:model Flight
4>然后将文件移动到models文件夹下,再更改下命名空间
1.2模型约定
  主要是以下几个方面:表名,主键,时间,日期格式,数据库
class Flight extends Model
{
/**
* 与模型关联的数据表。
*/
protected $table = 'my_flights'; /**
* 指定主键。
*/
public $primaryKey = 'id'; /**
* 指定是否模型应该被戳记时间。
*/
public $timestamps = false; /**
* 模型的日期字段保存格式。
*/
protected $dateFormat = 'U'; /**
* 此模型的连接名称。
*/
protected $connection = 'connection-name';
}
分别解释上面的定义:
1>除非数据表明确地指定了其它名称,否则将使用类的「蛇形名称」、复数形式名称来作为数据表的名称。例子中,Eloquent 将会假设 Flight 模型被存储记录在 flights 数据表中
2>Eloquent 也会假设每个数据表都有一个叫做 id 的主键字段。你也可以定义一个 $primaryKey 属性来重写这个约定。
3>默认情况下,Eloquent 会预计你的数据表中有 created_at 和 updated_at 字段。如果你不希望让 Eloquent 来自动维护这两个字段,可在模型内将 $timestamps 属性设置为 false:
4>如果你需要自定义自己的时间戳格式,可在模型内设置 $dateFormat 属性。这个属性决定了日期应如何在数据库中存储,以及当模型被序列化成数组或 JSON 时的格式:
5>默认情况下,所有的 Eloquent 模型会使用应用程序中默认的数据库连接设置。如果你想为模型指定不同的连接,可以使用 $connection 属性:

二.添加模型(增)

1>基本添加,save方法
返回值:true或者false
//首先创建一个新模型实例
$flight = new Flight;
//给这个模型添加属性
$flight->name = $name;
$flight->length = $length;
//... 其它更多属性
$flight->save();
此时created_at 以及 updated_at 时间戳将会被自动设置
2>批量赋值,create方法
返回值:Eloquent 模型实例
批量赋值就是我们不必像前面那样一个个定义模型属性,我们可以传递一个数组给模型类(这个数组通常是表单)
$flight = Flight ::create(Input::all());
  这个方法有个前提条件,出于安全考虑,我们需要在model中设置黑名单(不可以被赋值的属性 protected $guarded = ['price'])或者白名单(可以被赋值的属性 protected $fillable = ['name']),如果不设置的话会报错
注意:如果设置了protected $guarded = ['price']
 $input = [ 'name'=>'test',
  'content'=>'testflight',
  'length'=>2000,
  // 'price'=>1880, 即使这里写了价格,因为是受保护的,调用下面的create,也不会插入成功 ];
$flight = Flight ::create($input);
//如果想成功,那么就重新定义一下属性,然后调用save方法
$flight ->price= 200;
$flight ->save();
3>如果想要批量插入数据
返回值:true或者false
//$data是可以是二维数组
Flight::insert($data)
4>另外两个方法
// 用属性取回航班,当结果不存在时创建它...
返回值是Eloquent 模型实例
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// 用属性取回航班,当结果不存在时实例化一个新实例,此时尚未存入数据库,可以使用save方法存储
  $flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
  $flight->save(); //存入到数据库

三.删除模型(删)

1>要删除模型,在模型实例上调用 delete 方法:
返回值是true或者false
$flight = App\Flight::find(1);
  //先从是数据库中取回数据
  $flight->delete(); //实现删除
2>如果你知道模型的主键,可以不取回模型,直接删除
返回值是被删除记录数
App\Flight::destroy(1);
  App\Flight::destroy([1, 2, 3]);
  App\Flight::destroy(1, 2, 3);
3>通过查找来删除
返回值是删除条数
$deletedRows = App\Flight::where('active', 0)->delete();

四.更新模型(改)

1>使用save方法
返回值:true或者false
  $flight = App\Flight::find(1);
  $flight->name = 'New Flight Name';
  $flight->save();
2>使用update方法,同样要用到批量赋值(黑名单和白名单也起作用)
返回值:返回更新的条数
App\Flight::where('active', 1) ->where('destination', 'San Diego') ->update(['delayed' => 1]);
五.取回模型(查)
1>取回多个模型
每个 Eloquent 模型想像成强大的查询构造器,它让你可以流畅地查找与模型关联的数据表,可以通过相对应的属性来访问模型的字段值。
$flights = Flight::all();

//我们遍历查找每个返回的flight实例,并且输出每个实例的name字段
foreach ($flights as $flight) {
echo $flight->name;
}
可以增加限制
$flights = App\Flight::where('active', 1) ->orderBy('name', 'desc') ->take(10) ->get();
分块结果
Flight::chunk(200, function ($flights) { 
    foreach ($flights as $flight) {
      //
    }
  });
总结:
  <1>all和get等方法返回一个 Illuminate\Database\Eloquent\Collection 实例,这个实例中包含多个Eloquent 模型,Collection 类提供多种辅助函数来处理 Eloquent 结果。我们也可以简单地像数组一样来遍历集合:
  <2>Eloquent 模型是查询构造器,因此你应当去阅读所有查询构造器中可用的方法。你可在 Eloquent 查找中使用这其中的任何方法。
2>取回单个模型
这些方法返回的是单个模型的实例,而不是返回模型的集合:
$flight = App\Flight::find(1);
// 通过主键取回一个模型...
$flight = App\Flight::where('active', 1)->first();
// 取回符合查找限制的第一个模型 ...
$model = App\Flight::findOrFail(1);
//找不到模型时抛出一个异常
$model = App\Flight::where('legs', '>', 100)->firstOrFail();
3>其他一些连贯操作
使用 count、sum、max,和其它查询构造器提供的集合函数。这些方法会返回适当的标量值,而不是一个完整的模型实例:
$count = App\Flight::where('active', 1)->count(); 
  $max = App\Flight::where('active', 1)->max('price');

关于返回值的实际操作传送门:laravel框架之返回值

 
 

ORM模型简介的更多相关文章

  1. laravel框架总结(八) -- ORM模型

    ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...

  2. laravel5.2总结--ORM模型

    ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 ...

  3. django创建ORM模型、通过ORM模型操作单个表、ORM模型常用字段

    一.ORM简介 ORM ,全称Object Relational Mapping,中文叫做对象关系映射,通过ORM我们可以通过类的方式去操作数据库,而不用再写原生的SQL语句.通过把表映射成类,把行作 ...

  4. Sequelize 关系模型简介

    Sequelize 关系模型简介 先介绍一下本文用到的术语: 源: 调用 sequelize 中关系方法的调用者 目标: 调用 sequelize 中关系方法中的参数 比如, User.hasOne( ...

  5. Django ORM模型的一点体会

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...

  6. Django ORM模型:想说爱你不容易

    作者:Vamei 出处:http://www.cnblogs.com/vamei 严禁转载. 使用Python的Django模型的话,一般都会用它自带的ORM(Object-relational ma ...

  7. ORM模型

    一.创建及映射(orm_intro_demo文件) 在项目新建App下的models.py文件下新建ORM模型: from django.db import models #如果要将一个普通的类变成一 ...

  8. jvm-垃圾回收gc简介+jvm内存模型简介

    gc是jvm自动执行的,自动清除jvm内存垃圾,无须人为干涉,虽然方便了程序员的开发,但同时增加了开发人员对内存的不可控性. 1.jvm内存模型简介 jvm是在计算机系统上又虚拟出来的一个伪计算机系统 ...

  9. django ORM模型表的一对多、多对多关系、万能双下划线查询

    一.外键使用 在 MySQL 中,如果使用InnoDB引擎,则支持外键约束.(另一种常用的MyIsam引擎不支持外键) 定义外键的语法为fieldname=models.ForeignKey(to_c ...

随机推荐

  1. import time

    时间相关的操作,时间有三种表示方式: 时间戳               1970年1月1日之后的秒,即:time.time() 格式化的字符串    2014-11-11 11:11,    即:t ...

  2. 由浅入深漫谈margin属性

    margin 在中文中我们翻译成外边距或者外补白(本文中引用外边距).他是元素盒模型(box model)的基础属性. 一.margin的基本特性 margin 属性包括 margin-top, ma ...

  3. set源码之心得

    C++的STL很强大,强大到我只愿慵懒地去使用而不知其所以然.直到李师问我,我的回答被李师否定,我方才意识到自己是多么地浅陋.希望自己有空抽时间把STL源码给研究一下,化为自己真正可以掌控的力量. s ...

  4. 在PyCharm 软件中设置你的项目 使用的Python版本

    在PyCharm 软件中设置你的项目 使用的Python版本 python2 和 python3 有很大的不同,使用python2 编写的程序,如果使用python3 就运行不了:使用python3编 ...

  5. Linux minicom命令

    一.简介 minicom是Linux下的超级终端,与Windows下的超级终端功能相似,可以通过串口控制外部的硬件设备,可以用于管理和控制嵌入式设备 二.安装 1)yum安装 yum install ...

  6. rest-framework组件 之 视图三部曲

    浏览目录 使用混合(mixins) mixin类编写视图 使用通用的基于类的视图 viewsets.ModelViewSet 视图三部曲 使用混合(mixins) from rest_framewor ...

  7. 有趣的setTimeout

    今天在回顾JavaScript进阶用法的时候,发现一个有趣的问题,话不多说,先上代码: for(var j=0;j<10;j++){ setTimeout(function(){console. ...

  8. AJAX的dataType问题

    dataType是预期服务器返回的数据类型.如果不指定,jQuery 将自动根据 HTTP 包 MIME 信息来智能判断,比如 XML MIME 类型就被识别为 XML.在 1.4 中,JSON 就会 ...

  9. emr问题处理

    --通过his病历号查询emr中对应的患者ID --通过患者ID找出患者所有的病历集合ID --通过病历集合查找患者所有的病历 --通过病历dataID查找对应的病历数据,病历存在大字段中 '; -- ...

  10. 关于css js文件缓存问题

    什么情况下,要禁止静态文件缓存:1.经常可能要改动的 js, css.比如一个js文件引用如下<script src="test.js"></script> ...