ORM模型简介

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

1 定义模型

1.1创建model模型
1.1.1 模型通常放在 app 目录中,也可以放在任何可通过 composer.json 自动加载的地方。(app文件夹下的内容会被自动加载,建议在app下建立models文件夹,)
1.1.2 所有的 Eloquent 模型都继承自 Illuminate\Database\Eloquent\Model 类。
1.1.3 模型约定, 针对 'flights' 数据表,模型类名为 'Flight',注意单复数。
1.1.4 创建模型实例的最简单方法是使用 make:model artisan命令
php artisan make:model Flight
创建模型的同时生成数据库迁移,
php artisan make:model UserAccount --migration //两个横线
php artisan make:model UserAccount -m //一个横线
注意:
1>使用大驼峰表示,模型名是单数形式,迁移文件中数据表名是蛇形复数,
2>以上例子中模型文件名和类名是 UserAccount.php ,
3>迁移文件名是2017_08_10_131759_create_user_accounts_table.php,迁移文件中使用的表名是 user_accounts
1.1.5 生成的文件位于app目录下,然后将文件移动到models文件夹下,再更改下命名空间
1.2模型约定
  主要是以下几个方面:表名,主键,时间,日期格式,数据库
class Flight extends Model {
/**
* 与模型关联的数据表。
*/
protected $table = 'flight';
/**
* 指定主键。
*/
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 字段。将 $timestamps 属性设置为 false,则不会自动维护这两个字段。
4>时间戳格式:在模型内设置 $dateFormat 属性。这个属性决定了日期应如何在数据库中存储,以及当模型被序列化成数组或 JSON 时的格式:
5>数据库连接:默认,会使用应用程序中默认的数据库连接设置。想为模型指定不同的连接,可以使用 $connection 属性:
 

2 添加模型(增)

2.1 基本添加,save方法
返回值:true或者false
//首先创建一个新模型实例
$flight = new Flight;
//给这个模型添加属性
$flight->name = $name;
$flight->length = $length;
//... 其它更多属性
$flight->save();
此时created_at 以及 updated_at 时间戳将会被自动设置
2.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();
2.3 如果想要批量插入数据
返回值:true或者false
//$data是可以是二维数组
Flight::insert($data)
2.4 另外两个方法
// 用属性取回航班,当结果不存在时创建它...
返回值是Eloquent 模型实例
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);
// 用属性取回航班,当结果不存在时实例化一个新实例,此时尚未存入数据库,可以使用save方法存储

$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);   
$flight->save(); //存入到数据库

3 删除模型(删)

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

4 更新模型(改)

4.1 使用save方法
返回值:true或者false
$flight = App\Flight::find(1);   
$flight->name = 'New Flight Name';   
$flight->save();
4.2 使用update方法,同样要用到批量赋值(黑名单和白名单也起作用)
返回值:返回更新的条数
App\Flight::where('active', 1) ->where('destination', 'San Diego') ->update(['delayed' => 1]);

5 取回模型(查)

5.1 取回多个模型
1> all方法会取回模型数据表中所有结果
$flights = Flight::all();
//我们遍历查找每个返回的flight实例,并且输出每个实例的name字段
foreach ($flights as $flight) {
echo $flight->name;
}
2> 增加额外限制,使用get方法
$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 查找中使用这其中的任何方法。
5.2 取回单个模型
这些方法返回的是单个模型的实例,而不是返回模型的集合:
1> 通过主键取回一个模型,使用find方法
$flight = App\Flight::find(1);
2> 取回符合查找限制的第一个模型,使用first方法
$flight = App\Flight::where('active', 1)->first();
//找不到抛出异常
$model = App\Flight::findOrFail(1);
$model = App\Flight::where('legs', '>', 100)->firstOrFail();
5.3 其他一些连贯操作
使用 count、sum、max,和其它查询构造器提供的集合函数。这些方法会返回适当的标量值,而不是一个完整的模型实例:
$count = App\Flight::where('active', 1)->count();
$max = App\Flight::where('active', 1)->max('price');
 
 

laravel5.2总结--ORM模型的更多相关文章

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

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

  2. Django ORM模型的一点体会

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

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

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

  4. ORM模型

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

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

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

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

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

  7. laravel ORM 模型关联 with () 用法

    关联时想对关联表数据筛选时:MySQL查询: SELECT * FROM A LEFT JOIN B ON A.B_id = B.id AND B.condition = $condition ORM ...

  8. 通过ORM模型看python对象创建过程

    简易django ORM模型如下所示: #!/usr/bin/env python # encoding: utf-8 """ @version: 1.0 @author ...

  9. Eloquent ORM模型中添加自定义值

    我们都知道通过Laravel中数据库查询出来的模型对象都是基于数据库字段,今天给大家展示一个 Laravel Eloquent ORM 模型特性-附加值不存在于数据表中. 举个简单的栗子,一篇文章(p ...

随机推荐

  1. Python开发环境Wing IDE如何进行命令行调试

    Wing IDE专业的调试探针提供了一种强大的方法来发现和解决复杂的错误.这很像Python Shell但允许用户直接参与进已经暂停的调试程序中: 通过键入在刚才发生异常的地方键入下列数值进行尝试: ...

  2. iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法

    ios js 交互分为两块: 1.oc调用js 这一块实现起来比较简单, 我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择拷贝到工程中,(拖入的文件夹是蓝色 ...

  3. Hadoop 分片、分组与排序

    首先需要明确的是,hadoop里的key一定要是可排序的,要么key自身实现了WritableComparator接口,要么有一个排序类可以对key进行排序.如果key本身不实现WritableCom ...

  4. 前台使用load一个集合后台接受的方法

    前台: var imageCaseList = []; }; imageCaseList.push(data); $('#showData').load(url, { querys: imageCas ...

  5. 2018.6.7. 云服务器Centos系统使用yum或者rpm安装包时出现问题,安装时报出错误:

    当我向终端输入 sudo yum groupinstall chinese-support 语言安装包的时候显示下面的错误 error: rpmdb: BDB0113 Thread/process 3 ...

  6. spring mvc + swagger 配置

    首先,添加mvc框架(略)以及Swagger Maven依赖: <dependency> <groupId>io.springfox</groupId> <a ...

  7. 谷歌SwitchySharp && SwitchyOmega插件

    http://pan.baidu.com/s/1jOwgu 谷歌SwitchySharp插件 http://pan.baidu.com/s/1mgl7e2k SwitchySharp的升级版Switc ...

  8. Nginx学习记录(一)

    1. 什么是nginx Nginx是一款高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.由俄罗斯的程序设计师Igor Sysoev所开发,官方测试nginx能够支支 ...

  9. 在DOS界面下快速进入目录的技巧

    在DOS界面如果想进入某一目录还是比较困难的,尤其是有长目录名和中文目录名的时候. 比如:要进入“D:/工具箱/杀毒软件”这个目录. 1.在Windows下进入这个目录. 2.在地址栏输入 C:/WI ...

  10. 2018年ElasticSearch6.2.2教程ELK搭建日志采集分析系统(目录)

    章节一  2018年 ELK课程计划和效果演示 1.课程安排和效果演示 简介:课程介绍和主要知识点说明,ES搜索接口演示,部署的ELK项目演示 章节二 elasticSearch 6.2版本基础讲解到 ...