Laravel 的 Eloquent ORM学习

创建模型

首先,创建一个 Eloquent 模型,生成的模型通常放在 app 目录中,但你可以通过 composer.json 随意地将它们放在可被自动加载的地方。所有的 Eloquent 模型都继承了 Illuminate\Database\Eloquent\Model 类。

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php

namespace DriverTaskEditor\Models\Dao;

use DriverTaskEditor\Core\Dao;
use DriverTaskEditor\Common\Constant;

class ActivityDao extends Dao
{
/**
*(1)数据表名,必填 @var string
*/
protected $table = 'activity';

/**
*(2)主键,可选 @var int
* Eloquent 也会假定每个数据表都有一个名为 id 的主键字段。你可以定义一个受保护的 $primaryKey 属性来覆盖这个约定。
* Eloquent 假定主键是一个递增的整数值,这意味着在默认情况下主键会自动转换为 int。 如果使用的是非递增或者非数字的主键,则必须在模型上设置 public $incrementing = false。如果主键不是一个整数,则应该在模型上设置 protected $keyType = string
*/

/**
*(3)要连接的数据库(database.php中的key),可选,默认'default',@var string
*/
protected $connection = 'driver_task';

/**
* (4)必填:强转主键值类型; 使用toArray方法时,组件会根据主键自增类型,将主键类型转换为int;
* 故需要通过$casts再转回string,有些模型有这个变量有些没有,@var array
*/
protected $casts = [
'segments' => 'array',
'segment_conditions'=> 'array',
'cities' => 'array',
'status' => 'int',
'group_id' => 'int',
'trigger_type' => 'int',
'product_id' => 'int',
'product_line' => 'array',
'evaluate_info' => 'array',
'task_ids' => 'array',
'extra' => 'array',
'render_info' => 'array',
];


/**
* (5)需要被转换成日期的属性。
*
* @var array
*/
protected $dates = [
'create_time',
'modify_time',
];

/**
* (6)列表中的字段不可被批量赋值(create方法创建时不会写入该字段)
* $guarded和$fillable 二选一,一个表示黑名单,一个表示白名单
* @var array
*/
protected $guarded = ['id'];


/**
* (7)该模型是否被自动维护时间戳,可选,@var bool,默认为true
* Eloquent 会默认数据表中存在 created_at 和 updated_at这两个字段,如果你不需要这两个字段,则需要在模型内将 $timestamps 属性设置为 false
*/

/**
* (8)如果需要自定义用于存储时间戳的字段名,可在模型中通过设置 CREATED_AT 和 UPDATED_AT 常量来实现:
* 更新时间和修改时间的字段,如果没有则设置public $timestamps = false;
*/
const CREATED_AT = 'create_time';
const UPDATED_AT = 'modify_time';
}

查询

检索多个模型

Eloquent 的 all 方法会返回模型表中所有的结果。

1
2
3
4
5
6
7
8
9
<?php

use App\Flight;

$flights = App\Flight::all();

foreach ($flights as $flight) {
echo $flight->name;
}

由于每个 Eloquent 模型都可以当作一个 查询构造器,因此你还可以在查询中添加约束,然后使用 get 方法来获取结果:

1
2
3
4
$flights = App\Flight::where('active', 1)
->orderBy('name', 'desc')
->take(10)
->get();

注意: Eloquent 模型是查询构造器,因此你应当去阅读 查询构造器 提供的所有方法,以便你可以在 Eloquent 查询中使用。

集合

1、分块结果:如果需要处理数千个 Eloquent 记录,可以使用 chunk 命令。chunk 方法会检索 Eloquent 模型的「分块」,将它们提供给指定的 Closure 进行处理。在处理大型结果集时,使用 chunk 方法可节省内存:

1
2
3
4
Flight::chunk(200, function ($flights) {
foreach ($flights as $flight) {
//
}

注意:传递到方法的第一个参数是希望每个「分块」接收的数据量。闭包则被作为第二个参数传递,它会在每次执行数据库查询传递每个块时被调用。

2、使用游标:cursor 允许你使用游标来遍历数据库数据,该游标只执行一个查询。处理大量数据时,可以使用 cursor 方法可以大幅度减少内存的使用量:

1
2
3
foreach (Flight::where('foo', 'bar')->cursor() as $flight) {
//
}

检索单个模型/集合

除了从指定的数据表检索所有记录外,你也可以通过 find 或 first 方法来检索单条记录。这些方法不是返回一组模型,而是返回一个模型实例:

1
2
3
4
5
// 通过主键取回一个模型...
$flight = App\Flight::find(1);

// 取回符合查询限制的第一个模型 ...
$flight = App\Flight::where('active', 1)->first();

你也可以用主键数组为参数调用 find 方法,它将返回匹配记录的集合:

1
$flights = App\Flight::find([1, 2, 3]);

「找不到」异常
如果你希望在找不到模型时抛出异常,可以使用 findOrFail 以及 firstOrFail 方法。这些方法会检索查询的第一个结果。如果没有找到相应结果,就会抛出一个

1
2
3
4
5
Illuminate\Database\Eloquent\ModelNotFoundException:

$model = App\Flight::findOrFail(1);

$model = App\Flight::where('legs', '>', 100)->firstOrFail();

如果没有对异常进行捕获,则会自动返回 HTTP 404 响应给用户。也就是说,在使用这些方法时,不需要另外写个检查来返回 404 响应:

1
2
3
Route::get('/api/flights/{id}', function ($id) {
return App\Flight::findOrFail($id);
});

你还可以使用 查询构造器 提供的 count、sum、max 以及其它 聚合函数。这些方法只会返回适当的标量值而不是整个模型实例:

1
2
3
$count = App\Flight::where('active', 1)->count();

$max = App\Flight::where('active', 1)->max('price');

插入和更新模型

1、save方法插入新数据。
要在数据库中创建新记录,只需创建一个新的模型实例,并在模型上设置属性,然后调用 save 方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//插入
$flight = new Flight;
$flight->name = $request->name;
$flight->save();


$flight = App\Flight::create(['name' => 'Flight 10']);

//如果你已经有一个模型实例,你可以传递数组给 fill 方法:
$flight->fill(['name' => 'Flight 22']);


/*
* 其他创建方法
*/

// 通过 name 属性检索航班,当结果不存在时创建它...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);

// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性去创建它
$flight = App\Flight::firstOrCreate(
['name' => 'Flight 10'], ['delayed' => 1]
);

// 通过 name 属性检索航班,当结果不存在时实例化...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);

// 通过 name 属性检索航班,当结果不存在的时候用 name 属性和 delayed 属性实例化
$flight = App\Flight::firstOrNew(
['name' => 'Flight 10'], ['delayed' => 1]
);

//updateOrCreate
// 如果有从奥克兰飞往圣地亚哥的航班,将价格设为 99 美元
// 如果不存在匹配的模型就创建一个
$flight = App\Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99]
);

2、更新

1
2
3
4
5
//批量插入,update
方法需要传入表示要更新的字段的字段的值的键值对数组。
App\Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);

3、删除

可以在模型实例上调用 delete 方法来删除模型:

1
2
3
4
5
6
7
8
9
10
11
12
//通过主键删除
$flight = App\Flight::find(1);
$flight->delete();

//如果你已知道了这个模型的主键,则可以直接调用 destroy 方法删除它:
App\Flight::destroy(1);
App\Flight::destroy([1, 2, 3]);
App\Flight::destroy(1, 2, 3);

//通过查询删除模型
$deletedRows = App\Flight::where('active', 0)->delete();
//注意:使用 Eloquent 执行批量删除语句时,deleting 和 deleted 模型事件不会为已删除的模型触发。因为在执行删除语句时,不会检索模型实例。

参考:
Eloquent: 入门

转载请注明:本文档由 Laravel China 社区 laravel-china.org 组织翻译,详见 翻译召集帖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/242191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最后半天时间,支付宝等第三方支付机构备付金必须100%上交

这几天支付宝、微信等第三支付机构备付金100%上交央行的新闻相信大家已经看到很多&#xff0c;对于备付金可能大家都不是很了解&#xff0c;甚至很多人认为这是不是银行又跟支付宝等第三方支付机构过意不去了&#xff0c;今天我们就带大家来了解下事情的经过以及真相。央行铁令…

在WinAVR中设置Makefile自动编译多个源文件

初次使用WinAVR&#xff0c;了解到需要通过Makefile文件来设定程序编译时的一些值&#xff0c;发现当一个工程中加入多个源文件时不能同时编译&#xff0c;网上查了一下&#xff0c;需要修改Makefile文件&#xff1a; # List C source files here. (C dependencies are automat…

顺丰负债300亿就压力山大,而万达曾经负债4000亿却稳如泰山

近段顺丰负债300亿的消息闹得沸沸扬扬&#xff0c;作为国内快递一哥&#xff0c;顺丰借壳上市后市值曾经超过3000亿人民币&#xff0c;然而目前却负债300亿&#xff0c;这对于一家轻资产的快递公司来说可不得了。顺丰目前的处境难免让人联想到2017年的时候万达负债4000个亿的情…

2019年各大银行最新存款利率,这么存可以获得更多的利息!

2019年怎么存款才能获得最高的利率&#xff1f;这个相信口袋里有点钱的人都会关心的问题&#xff0c;今天我们就来跟大家仔细说一下。先来看一下2019年各大银行最新存款利率是多少。目前各大银行的存款利率跟2018年年底其实没有多大的差别&#xff0c;虽然已经过了2018年12月份…

怎样学习MSP430单片机

MSP430是Texas Instrument(TI&#xff0c;德州仪器)推出的一款超低功耗单片机。TI是一个非常有实力的、全球领先的芯片制造公司&#xff0c;MSP430不仅因为其优秀的设计&#xff0c;更因为TI提供的强有力的技术支持&#xff0c;而很快成为今天市场上非常受欢迎的一款单片机。 使…

【原创】“三次握手,四次挥手”你真的懂吗?

记得刚毕业找工作面试的时候&#xff0c;经常会被问到&#xff1a;你知道“3次握手&#xff0c;4次挥手”吗&#xff1f;这时候我会“胸有成竹”地“背诵”前期准备好的“答案”&#xff0c;第一次怎么怎么&#xff0c;第二次……答完就没有下文了&#xff0c;面试官貌似也没有…

17年前存款11万,取款时银行以销户为由拒绝,法院判银行全额赔付

1999年年底&#xff0c;陈伯在某银行的存折中存入2.6万元&#xff0c;加上这一笔&#xff0c;当时存折里总共有116703元&#xff0c;之后存折遗失。2016年&#xff0c;陈伯在搬家时找到这个存折。从2017年开始&#xff0c;陈伯多次拿着存折到银行取款&#xff0c;均被银行告知账…

VS2010 + OpenCV 2.4.1 环境配置

VS2010 OpenCV 2.4.1 环境配置 &#xff08;Windows 7 x64 中文旗舰版&#xff1b;Visual Studio 2010 中文旗舰版&#xff1b;OpenCV2.4.1。&#xff09; 1.用户环境变量&#xff08;或系统环境变量&#xff09;&#xff0c;新建或添加 PATH D:\Program Fil…

上市公司降价200万卖房仍然无人接手,有的甚至降价1900万

房价降价200万甩卖房子还卖不出去&#xff1f;看到这估计很多人不相信&#xff0c;因为通过各种数据统计&#xff0c;我们可以看到2018年中国大部分城市的房价都是上涨的&#xff0c;而且部分城市甚至上涨40%以上&#xff0c;但我们普通老百姓看到的却是有些业主降价几十万甚至…

2013电赛总结【西电专用】

电赛全称全国大学生电子设计竞赛&#xff0c;全国赛在每逢单数年的9月份举行&#xff0c;竞赛时间四天三夜。 竞赛流程 政策可能有变&#xff0c;每一届竞赛流程可能都不一样&#xff0c;这里只是根据我的了解进行总结的。 我们学校电赛差不多是从每年年初新学期开学时开始进行…

写一篇新文章

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Matlab与C/C++/Java的一些区别

变量 定义和初始化 C/C中要先定义变量&#xff0c;如果未初始化&#xff0c;其值一般是不确定的 Java中变量使用前&#xff0c;须初始化或赋值&#xff08;实例化时&#xff0c;类中的全局变量会自动被初始化为默认值&#xff09; Matlab中变量在写入时不需预先定义&#xff0c…

男子借款70万前后还了1600万仍未还清,如何避免套路贷?

事件回顾&#xff1a;男子借70万陷入套路贷&#xff0c;前后还了1600万。浙江宁波有一侯姓男子&#xff0c;自己是做石材生意的&#xff0c;本来自己一直安安分分做着生意&#xff0c;2013年年底&#xff0c;因为对一个建筑项目投标&#xff0c;急需一大笔钱。他通过中间人向张…

测试下HTML博文

发布测试 <script>window.onload function () {var obj document.getElementById("box");alert("获取#box元素成功");} </script>

一篇故事讲述了计算机网络里的基本概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等

从别处看到的一篇很不错的文章&#xff0c;形象地阐释了网络里的抽象概念。 计算机主机网关的作用是什么? 假设你的名字叫小不点&#xff0c;你住在一个大院子里&#xff0c;你的邻居有很多小伙伴&#xff0c;在门口传达室还有个看大门的李大爷&#xff0c;李大爷就是你的网关…

Photoshop图层学习总结

移动工具选择图层 方式1&#xff1a;按Ctrl键并单击画布相应位置&#xff0c;选择相应图层 方式2&#xff1a;勾选“自动选择” 图层蒙版 图层蒙版中白色部分&#xff0c;对应图层位置会显示&#xff1b;黑色部分&#xff0c;对应图层不显示(即为透明) 1、可在图层面板创建 2、…

Photoshop常用快捷键

常规CtrlA/X/C/V全选/剪切/复制/粘贴CtrlN新建文件CtrlShiftN新建图层CtrlS保存CtrlShiftS保存为选择CtrlD 取消选择Shift添加到选区Alt 从选区减去 ShiftAlt 与选区交叉Ctrl移动选区变形Shift保持长宽比Alt 中心对称 Ctrl扭曲变形缩放滚动Alt鼠标滚轮 缩放Ctrl鼠标滚轮左右滚动…

5000万存银行会有什么待遇?有钱真让人羡慕!

年底了估计有不少朋友家里拆迁&#xff0c;5000万赔偿款正愁着没地方花&#xff01;所以想找个银行存钱&#xff01;开个玩笑&#xff0c;我们回归正题&#xff0c;你要是真有5000万存进银行&#xff0c;那不管是对国有大银行还是对一些小银行来说&#xff0c;绝对是一笔大额数…