首页
学习
活动
专区
圈层
工具
发布

Laravel源码解析之Model

根据单一责任开发原则来讲,在laravel的开发过程中每个表都应建立一个model对外服务和调用。...protected $table = 'users'; } 解析 Laravel的数据操作分两种 – DB facade – Eloquent ORM 它们除了有各自的特色外,基本的数据操作都是通过...这个文件在你项目目录中的 vendor/laravel/framework/src/Illuminate/Database/Query 下,你可以自行去查看。...Database\Query 类,开头我们讲过这个类了,这里就不多说了,随后就是各种sql的拼接->执行sql->结束战斗 Eloquent ORM Eloquent ORM 与DB facade 类似...如果你在代码用到了get方法,抱歉,这里没有,它依旧会通过__call 方法将你的请求转发到 Illuminate\Database\Query\Builder 类中 $this->query->{$method

1.6K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Laravel5.2之模型关联预加载

    说明:本文主要说明Laravel Eloquent的延迟预加载(Eager Loading),使用延迟预加载来减少MySQL查询次数。同时,会将开发过程中的一些截图和代码黏上去,提高阅读效率。...: composer require barryvdh/laravel-debugbar --dev composer require barryvdh/laravel-ide-helper --dev...预加载查询 (1)嵌套预加载 Eloquent在通过属性访问关联数据时是延迟加载的,就是只有该关联数据只有在通过属性访问它时才会被加载。在查找上层模型时可以通过预加载关联数据,避免N+1问题。...而且,使用预加载超级简单。...发现:只有4个query,耗时3.58ms,效率提高很多。把原来的N+1这种query改造成了where..in..这种query,效率提高不少。可以用EXPLAIN来查看SQL语句的执行计划。

    3.5K41

    3分钟短文:Laravel 使用DB门面操作原生SQL

    引言 我们推荐使用laravel的eloquent orm 模型操作数据库表, 因为特性更为丰富,组装更为灵活,在编程层面操作数据的来来去去非常直观。...学习时间 系统提供了DB门面用于原生的SQL操作,在程序内引入下面的类: use Illuminate\Support\Facades\DB; 该类的定义很简单,标准的门面注册方法: class DB...DB门面既可以使用query builder的链式操作,也可以用于执行原生查询。举几个例子。...扩展一下,带有查询条件的SQL原生语句, 为了防止SQL注入,使用参数绑定的方式: $usersOfType = DB::select('select * from users where type =...一般我们不推荐使用原生SQL语句操作数据库,提倡大家把数据库操作集中到模型层, 充分利用eloquent orm的性能。

    2.8K20

    如何扩展Laravel Auth来满足项目需求

    之前写过两篇文章分别介绍了Laravel Auth认证系统的构成和实现细节知道了Laravel是如何应用看守器和用户提供器来进行用户认证的,但是在现实工作中大部分时候产品用户体系是早就有的这种情况下就无法使用框架自带的...想了解实现细节的可以回看下面两篇文章 Laravel源码解析之用户认证系统(一) Laravel源码解析之用户认证系统(二) 在介绍用户认证系统基础的时候提到过Laravel自带的注册和登录验证用户密码时都是去验证采用...bcypt加密存储的密码,但是很多已经存在的老系统中用户密码都是用盐值加明文密码做哈希后存储的,如果想要在这种老系统中应用Laravel开发项目的话那么我们就不能够再使用Laravel自带的登录和注册方法了...config/auth.php里配置让看守器使用新注册的 custom-eloquent作为用户提供器了: //config/auth.php 'providers' => [ 'users'...的用户认证系统,目的是让大家对Laravel的用户认证系统有一个更好的理解知道在Laravel系统默认自带的用户认证方式无法满足我们的需求时如何通过自定义这两个组件来扩展功能完成我们项目自己的认证需求。

    3.5K20

    orm 系列 之 Eloquent演化历程2

    ,也是laravel中一大亮点Artisan,Artisan是 Laravel 自带的命令行接口名称,此处不做具体的介绍了,有机会再细说的,当我们在命令行中执行php artisan command的时候...本文最后讲下Eloquent中新增的对象之间的关系:多态关系,以下内容摘自[ Laravel 5.3 文档 ] Eloquent ORM —— 关联关系 表结构 多态关联允许一个模型在单个关联下属于多个不同模型...让我们跟着git继续追踪吧_ 新纪元 为了解决PHP组件管理及散步的问题,2009年的php|tek大会上成立了PHP-FIG组织,目的在于透过三个方式来制定PHP社群在开发组件时的规范,laravel...Manager,记得网上搜索过关键字Using Eloquent outside Laravel,我们可以看到一篇Vivek Kumar Bansal写的文章,文章从2方面介绍了怎么使用Eloquent...Schema和Query,同时DatabaseManger和Eloquent还处理协作关系,Eloquent负责领域类的打理,最后ConnectionFactory则打点着所有的Connection,提供基础的功能

    3.5K30

    Laravel 如何实现数据的软删除

    对于任何一个模型,如果需要使用软删除功能,需要在模型中使用 Illuminate\Database\Eloquent\SoftDeletes这个 trait。...->update($columns); } Model查询过滤删除数据 Laravel中允许在Model中static::addGlobalScope方法添加全局的Scope。...这样就可以在查询条件中添加一个全局条件。Laravel中软删除数据的过滤也是使用这种方式实现的。...以上就是Laravel实现软删除的大概逻辑。这里有一个细节,Laravel中软删除的标记是一个时间格式的字段,默认delete_at。通过是否为null判断数据是否删除。...但是有的时候,项目中会使用一个整形的字段标记数据是否删除。在这样的场景下,需要对Laravel的软删除进行修改才能够实现。

    3.3K10

    Laravel Eloquent 模型关联关系(下)

    在 Eloquent 模型上进行关联查询主要分为两种方式,一种是懒惰式加载(动态属性),一种是渴求式加载(通过with方法)。...统计关联模型 我们还可以通过 Eloquent 提供的 withCount 方法在不加载关联模型的情况下统计关联结果的数量。...所以不管模型实例有多少个,关联结果只会查询一次,加上模型本身查询总共是两次查询,在列表查询时,大大减少了对数据库的连接查询次数,因而有更好的性能表现,推荐使用。...Eloquent 允许我们为这种空对象定义一个默认的类型,这个对象的类型可以在定义关联关系的时候指定: public function author() { return $this->belongsTo...希望你看完学院君的这一系列教程可以了解并完全掌握 Eloquent 模型的定义和使用,有什么问题,欢迎随时与我交流。

    23.3K30

    【Laravel系列4.4】模型Eloquent ORM的使用(二)

    模型Eloquent ORM的使用(二) 对于模型的探索我们还将继续。上篇文章中,只是简单地通过模型操作了一下数据库,并且学习了一下关联操作的知识。...在所有模型都要继承的 laravel/framework/src/Illuminate/Database/Eloquent/Model.php 类中,我们很快就能发现一个 query() 静态方法。...而不是我们之前 查询构造器 中的 laravel/framework/src/Illuminate/Database/Query/Builder.php 对象。...但 Eloquent\Builder 的内部持有的一个query 属性依然是 Query\Builder 对象,也就是说在底层,它依然是调用的我们熟悉的那个 查询构造器 来进行工作的。...但是,这里划重点了,Eloquent\Builder 中有些方法是没有的,比如说 insert()、insertGetId() ,在模型中,使用 save() 就可以代替这两个方法的操作。

    4.8K20

    3分钟短文:Laravel 从软删除说到模型作用域的概念

    代码时间 常规的删除操作分两步进行,一步是把数据从数据库中查询出来,使用laravel模型的方法, 则返回的是一个模型对象。第二步,调用模型对象的delete方法。...所以引入了软删除的概念,就是在表内添加一个字段,用于标记,这一行条目是否算是删除状态。在laravel中, 这个软删除字段默认是 deleted_at。你也可以在模型中手动指定。...然后在模型中,引入软删除的功能,将其进行全局生效的使用。...::addGlobalScope(new SoftDeletingScope);} 这样在应用程序内,使用该模型的所有方法,都会被追加全局可见的查询条件。...写在最后 本文从laravel模型的写操作删除动作,讲到了软删除的概念。进而引申出来本地作用域和全局作用域的使用。软删除几乎贯穿了我们应用的始终,需要大家勤学苦练。

    2K30

    【译】20个 Laravel Eloquent 小技巧(上)

    下面是翻译自 Laravel-News 的一篇教程,总结了 Laravel 的对象关系映射框架(ORM)的几个小技巧。...Eloquent ORM 在其表面简单易用的机制背后,还有很多半隐藏的功能或者少有人知的方法来实现一些很有用的需求。 在本文中,我将向您展示一些技巧。 1....模型的 boot() 方法 在Eloquent模型中有一个名为boot()的神奇地方,您可以在其中覆盖默认行为: class User extends Model { public static...') { $query->orderBy('created_at', request('ordering_rule', 'desc')); } 但是一个更好的方法是——使用 when()方法 $...withDefault([ 'name' => 'Guest Author' ]); } 太长了,下一篇再续上 http://blog.kbiao.me/2019/01/05/20-Laravel-Eloquent-Tips-and-Tricks

    3.1K50

    通过修改Laravel Auth使用salt和password进行认证用户详解

    Auth非常强大易用,不过在Laravel的用户认证系统中用户注册、登录、找回密码这些模块中用到密码加密和认证算法时使用的都是bcrypt,而很多之前做的项目用户表里都是采用存储salt + password...加密字符串的方式来记录用户的密码的,这就给使用Laravel框架来重构之前的项目带来了很大的阻力,不过最近自己通过在网上找资料、看社区论坛、看源码等方式完成了对Laravel Auth的修改,在这里分享出来希望能对其他人有所帮助...Auth使用,好了做完这些修改后Laravel的Auth在做用户登录验证的时候采用的就是自定义的salt + password的方式了。...修改重置密码 Laravel 的重置密码的工作流程是: 向需要重置密码的用户的邮箱发送一封带有重置密码链接的邮件,链接中会包含用户的email地址和token。...注:使用的Laravel版本为5.2

    4.1K30

    在 Laravel 中当 MySQL 异常宕机时强制返回空数据

    业务常规的查询逻辑如下: 从redis中获取数据, 有则返回 当第一步redis无数据, 去MySQL查询数据 把第二步查询到的数据写入redis 返回数据 问题分析 redis当然不会有问题, 问题是在第二步的时候...去MySQL查询数据,数据库服务已经宕机, 这时候请求阻塞住 阻塞超时,然后抛出异常,导致无法走到第三步 下一次请求来, 又继续去连接MySQL,无限阻塞,把业务服务器也拖垮 解决方案 这是我们的解决方案...当MySQL宕机强制缓存空数据到redis,允许部分页面为空.而不是无法提供服务 解决思路 设置好合理的MySQL连接超时时间 mysqlnd.net_read_timeout = 3 当数据库连接超时之后...public function newEloquentBuilder($query) { return new MysqlCustomBuilder($query);...try { return parent::get($columns); } catch (\Exception $e) { // 根据 laravel

    93710

    Laravel源码分析之模型关联

    使用模型关联给应用开发带来的收益我认为有以下几点 主体数据和关联数据之间的关系在代码表现上更明显易懂让人一眼就能明白数据间的关系。...使用模型关联预加载后,在效率上高于开发者自己写join和子查询,模型关联底层是通过分别查询主体和关联数据再将它们关联匹配到一起。...按照Laravel设定好的模式来写关联模型每个人都能写出高效和优雅的代码 (这点我认为适用于所有的Laravel特性)。...,按照约定Eloquent 默认使用父级模型名的「snake case」形式、加上 _id 后缀名作为外键字段。...动态属性加载关联模型 上面我们定义了三种使用频次比较高的模型关联,下面我们再来看一下在使用它们时关联模型时如何加载出来的。

    11.1K10

    3分钟短文:Laravel 模型查询数据库的几个关键方法

    引言 本期继续我们的laravel学习,主要说一说laravel使用eloquent orm 模型 读取数据库条目的几个常用方法。 ?...因为设计的原因,laravel支持的链式操作 本质上方法的返回值归属于不同的类。所以在使用方法之前务必明确调用的是哪个类的那个方法,返回的是什么类型的数据。...eloquent门面为我们提供了很多好用的链式操作方法, 在query builder筛选出合适的条目后,返回一个eloquent collection,或者是一个 基类的collection对象,可以直接使用集合的方法操作数据集...这些方法,都是集合的操作,也就是说 在执行之前,数据库查询是全量的,这对于数据库服务器和web服务器不再一台主机的情况, 网络传输量是个不小的考验。...所以我们推荐使用where语句进行数据库SQL操作,将合适的结果集返回,这样精简了数据库负载, 再者,使用集合的操作方法,对结果集进行进一步的格式化,效率会高的多。

    3K40

    3分钟短文:Laravel模型作用域,为你“节省”更多代码

    引言 原则上代码写一次,处处是引用,不需要大量的冗余代码,这是一种趋势,也是提高代码健壮性的努力方向。 laravel模型为我们提供了一层数据库操作层,将数据交互独立出来。...全局作用域 假设有些数据库查询操作,无论是在控制器内,或者在模板文件内,或者命令行方法内,都有重复的使用需求,要是在模型内有一个公用的方法,默认就加上这些筛选条件,就可以显著减少代码量了。...events WHERE `published` = 1; 如果条件 published = 1 在默认的情况下需要开启,我们可以使用laravel模型的 全局作用域 方式为所有查询追加上这个条件。...在模型文件 Event 内头部引入下述类: use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Builder...而声明一个本地作用域,只要遵循laravel的语法规定即可,如下示例: public function scopePublished($query) { return $query->where('published

    1.8K22
    领券