当前位置: 首页 > 编程日记 > 正文

Laravel Lumen之Eloquent ORM使用速查-基础部分

使用Eloquent ['eləkwənt] 时,数据库查询构造器的方法对模型类也是也用的,使用上只是省略了DB::table('表名')部分。

在模型中使用protected成员变量$table指定绑定的表名。

<?php
namespace App;use Illuminate\Database\Eloquent\Model;class Flight extends Model
{protected $table = 'my_flights';
}

Eloquent 假设每个表都有一个名为id的主键,可以通过$primaryKey成员变量覆盖该字段名称,另外,Eloquent假设主键字段是自增的整数,如果你想用非自增的主键或者非数字的主键的话,必须指定模型中的public属性$incrementing为false。

默认情况下,Eloquent期望表中存在created_atupdated_at两个字段,字段类型为timestamp,如果不希望这两个字段的话,设置$timestamps为false

<?phpnamespace App;use Illuminate\Database\Eloquent\Model;class Flight extends Model
{public $timestamps = false;protected $dateFormat = 'U';
}

使用protected $connection = 'connection-name'指定模型采用的数据库连接。

查询

基本查询操作

方法all用于返回模型表中所有的结果


$flights = Flight::all();
foreach ($flights as $flight) {echo $flight->name;
}

也可以使用get方法为查询结果添加约束

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

可以看到,查询构造器的方法对模型类也是可以使用的

在eloquent ORM中,getall方法查询出多个结果集,它们的返回值是一个Illuminate\Database\Eloquent\Collection对象,该对象提供了多种对结果集操作的方法

public function find($key, $default = null);
public function contains($key, $value = null);
public function modelKeys();
public function diff($items)
...

该对象的方法有很多,这里只列出一小部分,更多方法参考API文档 Collection 和使用说明文档。

对大量结果分段处理,同样是使用chunk方法


Flight::chunk(200, function ($flights) {foreach ($flights as $flight) {//}
});

查询单个结果

使用findfirst方法查询单个结果,返回的是单个的模型实例

// 通过主键查询模型...
$flight = App\Flight::find(1);// 使用约束...
$flight = App\Flight::where('active', 1)->first();

使用find方法也可以返回多个结果,以Collection对象的形式返回,参数为多个主键

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

如果查询不到结果的话,可以使用findOrFail或者firstOrFail方法,这两个方法在查询不到结果的时候会抛出Illuminate\Database\Eloquent\ModelNotFoundException异常

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

如果没有捕获这个异常的话,laravel会自动返回给用户一个404的响应结果,因此如果希望找不到的时候返回404,是可以直接使用该方法返回的

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

查询聚集函数结果

与查询构造器查询方法一样,可以使用聚集函数返回结果,常见的比如maxminavgsumcount

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

分页查询

分页查询可以直接使用paginate函数

LengthAwarePaginator paginate( int $perPage = null, array $columns = array('*'), string $pageName = 'page', int|null $page = null
)

参数说明

参数类型说明
perPageint每页显示数量
columnsarray查询的列名
pageNamestring页码参数名称
pageint当前页码

返回值为 LengthAwarePaginator 对象。

$limit = 20;
$page = 1;
return Enterprise::paginate($limit, ['*'], 'page', $page);

插入

基本插入操作

插入新的数据只需要创建一个新的模型实例,然后设置模型属性,最后调用save方法即可


$flight = new Flight;
$flight->name = $request->name;
$flight->save();

在调用save方法的时候,会自动为created_atupdated_at字段设置时间戳,不需要手动指定

批量赋值插入

使用create方法可以执行批量为模型的属性赋值的插入操作,该方法将会返回新插入的模型,在执行create方法之前,需要先在模型中指定fillableguarded属性,用于防止不合法的属性赋值(例如避免用户传入的is_admin属性被误录入数据表)。

指定$fillable属性的目的是该属性指定的字段可以通过create方法插入,其它的字段将被过滤掉,类似于白名单,而$guarded则相反,类似于黑名单。

protected $fillable = ['name'];
// OR
protected $guarded = ['price'];

执行create操作就只有白名单或者黑名单之外的字段可以更新了

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

除了create方法,还有两外两个方法可以使用firstOrNewfirstOrCreate

firstOrCreate方法用来使用给定的列值对查询记录,如果查不到则插入新的。fristOrNewfirstOrCreate类似,不同在于如果不存在,它会返回一个新的模型对象,不过该模型是未经过持久化的,需要手动调用save方法持久化到数据库。

// 使用属性检索flight,如果不存在则创建...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);// 使用属性检索flight,如果不存在则创建一个模型实例...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);

更新

基本更新操作

方法save不仅可以要用来插入新的数据,也可以用来更新数据,只需先使用模型方法查询出要更新的数据,设置模型属性为新的值,然后再save就可以更新了,updated_at字段会自动更新。

$flight = App\Flight::find(1);
$flight->name = 'New Flight Name';
$flight->save();

也可使用update方法对多个结果进行更新

App\Flight::where('active', 1)->where('destination', 'San Diego')->update(['delayed' => 1]);

删除

基本删除操作

使用delete方法删除模型

$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();

软删除

软删除是在表中增加deleted_at字段,当删除记录的时候不会真实删除记录,而是设置该字段的时间戳,由Eloquent模型屏蔽已经设置该字段的数据。

要启用软删除,可以在模型中引用Illuminate\Database\Eloquent\SoftDeletes这个Trait,并且在dates属性中增加deleted_at字段。

<?phpnamespace App;use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;class Flight extends Model
{use SoftDeletes;protected $dates = ['deleted_at'];
}

要判断一个模型是否被软删除了的话,可以使用trashed方法


if ($flight->trashed()) {//
}

查询软删除的模型

包含软删除的模型

如果模型被软删除了,普通查询是不会查询到该结果的,可以使用withTrashed方法强制返回软删除的结果

$flights = App\Flight::withTrashed()->where('account_id', 1)->get();// 关联操作中也可以使用
$flight->history()->withTrashed()->get();
只查询软删除的模型
$flights = App\Flight::onlyTrashed()->where('airline_id', 1)->get();
还原软删除的模型

查询到软删除的模型实例之后,调用restore方法还原

$flight->restore();

也可以在查询中使用

App\Flight::withTrashed()->where('airline_id', 1)->restore();// 关联操作中也可以使用
$flight->history()->restore();
强制删除(持久化删除)
// Force deleting a single model instance...
$flight->forceDelete();// Force deleting all related models...
$flight->history()->forceDelete();

上述操作后,数据会被真实删除。


参考:

  • Eloquent: Getting Started

相关文章:

数据库连接字在Web.config里的用法

作者&#xff1a;未知 请速与本人联系在asp.net中的WEB程序的设置中我们必须用到Web.config来存储数据库连接字.事实上这是个很好的做法,因为可以省去我们很多的麻烦还可以帮助我们避免不必要的错位,是的很多情况下我就是这样做.它通过XML来记录这些信息.具体的是在....这个标…

重构ncnn,腾讯优图开源新一代移动端推理框架TNN

来源 | 腾讯优图从学界到工业界&#xff0c;“开源”已经成为AI领域的一个关键词。一方面&#xff0c;它以“授人以渔”的方式为AI构建了一个开放共进的生态环境&#xff0c;帮助行业加速AI应用落地&#xff1b;另一方面&#xff0c;在解决行业实际问题时持续更新和迭代&#x…

java读取文件

1 java8读取文本文件2 3 4 public static void java8ReadFileLines(String fileName) throws IOException {5 List lineList Files.readAllLines(Paths.get(fileName), StandardCharsets.UTF_8);6 7 for(String line:lineList){8 Sys…

常见 Datagrid 错误

Marcie Robillard DatagridGirl.comDatagrid 控件是 Microsoft ASP.NET 中功能最强、用途最广的 Web 控件之一&#xff0c;这一点已经得到了 ASP.NET 权威人士的认同。虽然 Datagrid 控件易于使用&#xff0c;但同样易于给使用者带来麻烦。以下是许多人所犯的一些错误&#xff…

干货!3 个重要因素,带你看透 AI 技术架构方案的可行性!

作者 | 房磊责编 | Carol出品 | AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;人工智能这几年发展的如火如荼&#xff0c;不仅在计算机视觉和自然语言处理领域发生了翻天覆地的变革&#xff0c;在其他领域也掀起了技术革新的浪潮。无论是在新业务上的尝试&…

mysql从另一张获取数据的方法

方法一 CREATE TABLE tmp AS SELECT a.id FROM t_user t JOIN temp a ON t.email a.email; 方法二 INSERT INTO t_user (id,username,PASSWORD,email,user_type,STATUS) SELECT id,REPLACE(email,,_),PASSWORD,email,0,0 FROM temp; 这两个sql都是从另外一张中获取的数据插入…

手动创建Spring项目 Spring framework

之前学习框架一直是看的视频教程&#xff0c;并且在都配套有项目源码&#xff0c;跟着视频敲代码总是很简单&#xff0c;现在想深入了解&#xff0c;自己从官网下载文件手动搭建&#xff0c;就遇到了很多问题记载如下。 首先熟悉一下spring的官方网站&#xff1a;http://spring…

使用 ASP+ DataGrid 控件来创建主视图/详细资料视图

Nikhil Kothari Microsoft Corporation 2000年8月简介 Microsoft Visual Studio.NET 的下一发行版包括 DataGrid Web 控件 (作为服务器控件的 Active Server Page (ASP) 套件的一部分)。 该控件提供用以根据数据源的内容来表示 HTML 的功能。 DataGrid 控件可以用于若干个只…

如何将广告始终定位到网页右下角

body{margin:0;border:0;height:100%;overflow-y:auto;}#test{display:block; bottom:3px; right:3px; width:130px; position:fixed;}/* 以下是写给IE6的 */* html #test{position:absolute;right:18px} * html{overflow-x:auto; overflow-y:hidden;}转载于:https://www.cnblo…

如何用 Python 将 Excel 表格转成可视化图形?| 原力计划

作者 | Waao666责编 | 王晓曼出品 | CSDN 博客前言大家知道&#xff0c;考研很大一部分也是考信息收集能力。每年往往有很多人就是在这上面栽跟头了&#xff0c;不能正确分析各大院校往年的录取信息&#xff0c;进而没能选择合适的报考院校。至于很多院校的录取信息是以 PDF 形…

Mac OS X 下mysql配置备忘

从windows过渡到os x确实需要适应&#xff0c;对于开发人员来讲更是这样。从官网下载目前最新版本的mysql 5.7.13&#xff0c;下载地址&#xff1a;http://dev.mysql.com/downloads/mysql/刚开始非常顺利的安装完mysql&#xff0c;这时候我还没有意识到密码的问题&#xff0c;直…

为 ASP.NET Datagrid 创建自定义列

Marcie Robillard DatagridGirl.com 2003 年 9 月 简介 不得不承认&#xff0c;为 Microsoft ASP.NET 编写 Datagrid 代码包括大量的重复工作。尽管我深受该控件的困扰&#xff0c;但我还是不断寻找简化这类任务的捷径。谁都不愿意做重复的工作&#xff0c;对不对&#xff1…

不怕面试被问了!二叉树算法大盘点

作者 | BoCong-Deng题图 | 视觉中国出品 | CSDN博客树结构对于程序员来说应该不陌生&#xff0c;特别是二叉树&#xff0c;基本只要接触算法这一类的都一定会碰到的&#xff0c;所以我打算通过一篇文章&#xff0c;对二叉树结构的相关算法进行总结汇总&#xff0c;思路和代码实…

Field types

2019独角兽企业重金招聘Python工程师标准>>> Field types The generated Form class will have a form field for every model field. Each model field has a corresponding default form field. For example, a CharField on a model is represented as a CharFie…

【51CTO学院三周年】我的职业生涯有贵人相助--小强老师

个人认为功能测试做到一定年限之后&#xff0c;自然会遇到职业生涯中最大瓶颈——转型。对此&#xff0c;我的经历是这样的。话说那还是两年前&#xff0c;在搜索某问题的时候发现了51CTO&#xff0c;从中看到了很多大牛的博文和视频课程&#xff0c;顿时感觉自己找到宝了&…

在.NET中实现彩色光标,动画光标和自定义光标

作者&#xff1a;孟宪会 微软MVPTest.cs using System;using System.Drawing;using System.Windows.Forms;using System.Runtime.InteropServices;using System.Reflection; namespace ColorCursor{ public class Form1 : System.Windows.Forms.Form { [DllImport("us…

magento模板区块--首页content区块

首页替换 自定义首页content内容 在cms-->>page 新建首页 在content 里加入 -------------------------- <div class"col-left side-col"> <p class"home-callout"><a href"{{store direct_url"apparel/shoes/womens/anash…

遮挡也能识别?地平线提出时序信息提升行人检测准确度|​CVPR 2020

来源 | 驭势科技行人检测作为计算机视觉领域最基本的主题之一&#xff0c;多年来被广泛研究。尽管最先进的行人检测器已在无遮挡行人上取得了超过 90% 的准确率&#xff0c;但在严重遮挡行人检测上依然无法达到满意的效果。究其根源&#xff0c;主要存在以下两个难点&#xff1…

通过响应式web设计,使本站支持手机浏览

2019独角兽企业重金招聘Python工程师标准>>> 2014-01-28 14:49:14 现在越来越多的人通过手机来上网&#xff0c;手机由于屏幕尺寸的原因&#xff0c;当浏览为PC端浏览器设计的网页的时候&#xff0c;往往会出现各种各样的问题。 糊涂僧的这个小博客也一样&#xff0…

在ASP.NET中跨页面实现多选

作者&#xff1a;孟宪会 微软MVP SelectMultiPages.aspx <% Page EnableViewState"true" CodeBehind"SelectMultiPages.aspx.cs" Language"c#" AutoEventWireup"false" Inherits"eMeng.Exam.SelectMultiPages" %><…

c#有多少种可能导致写文件失败?

1.路径中有非法字符 Path.GetInvalidPathChars() 2.文件名中有非法字符 Path.GetInvalidFileNameChars() 3.文件创建时&#xff0c;文件夹只读。 4.文件创建时&#xff0c;文件夹权限不足&#xff0c;如需要管理员权限。 5.文件创建时&#xff0c;文件夹不存在。 6.系统目录&am…

抖音、快手和直播行业的火爆究竟给了谁机会?

经常收到一些CSDN小伙伴的留言&#xff0c;反馈如下这样的困惑“短视频这么火爆&#xff0c;我该学些什么技术才能入行&#xff1f;”“我想从事音视频开发&#xff0c;该如何入门和进阶&#xff1f;真的像坊间传闻的那么难吗&#xff1f;”音视频的开发前景做一个不恰当的比喻…

android上line-height的问题

关于line-height大家应该非常熟悉了吧&#xff0c;就是用来做垂直居中的&#xff0c;屡试不爽&#xff0c;基本上没有什么问题&#xff0c;但是最近一个项目&#xff0c;测试提了一个bug&#xff0c;看图吧。 从别处窃的图&#xff0c;这个问题只有安卓上才能复现&#xff0c;做…

深入讲解 ASP+ 验证

Anthony Moore Microsoft Corporation 2000年10月简介 这篇文章详细讲解了 ASP 验证控件的工作方式。如果要生成其中包含验证控件的复杂页面&#xff0c;或是要扩展验证框架&#xff0c;建议您阅读本文。如果要学习使用验证控件&#xff0c;或是要决定是否使用验证控件&…

EditText和TextView出现中文、英文等string串的排版问题

默认EditText和TextView自动换行。如果在string中出现了中文字符&#xff0c;排版出现意外&#xff0c;如图所示&#xff1a; 这是因为软盘默认的是半角输入&#xff0c;而字母与数字的占位与汉字不同&#xff0c;所以在默认的情况下会出现如上的排版情况。 但是如果将默认的半…

阿里云蒋江伟:我们致力于为世界提供70%的算力 | 凌云时刻

导读&#xff1a;6月9日&#xff0c;2020阿里云峰会在云端召开&#xff0c;阿里巴巴合伙人、阿里云智能基础产品事业部高级研究员蒋江伟出席峰会并做了题为《新基建&#xff0c;新算力&#xff1a;阿里云基础设施算力全新升级》的重磅发布。&#xff08;以下内容为演讲实录&…

zabbix 微信报警( python 2.x )

python 2.x 微信报警脚本#!/usr/bin/python #_*_coding:utf-8 _*_ __author__ lvnianimport urllib,urllib2 import json import sysdef gettoken(corpid,corpsecret):gettoken_url https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid corpid &corpsecret corpsec…

利用 AssemblyAI 在 PyTorch 中建立端到端的语音识别模型

作者 | Comet译者 | 天道酬勤&#xff0c;责编 | Carol出品 | AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;这篇文章是由AssemblyAI的机器学习研究工程师Michael Nguyen撰写的。AssemblyAI使用Comet记录、可视化和了解模型开发流程。深度学习通过引入端到端的…

PHP中的页面跳转

PHP页面跳转一、header()函数 点击按钮<input type"submit" name "submit" value"确定" /> 使用POST方式<form action"X.php" method"post"> X.php页面只做判断逻辑 处理完以后 <?php //isset函数 if…

Closure Compiler 使用

为什么80%的码农都做不了架构师&#xff1f;>>> 该项目首页&#xff1a;http://code.google.com/intl/zh-CN/closure/compiler/ 下载地址&#xff1a;http://closure-compiler.googlecode.com/files/compiler-latest.zip 下载后解压&#xff0c;即可看到compiler.j…