laravel5.1框架model类查询实现
laravel框架model类查询实现:
User::where(['uid'=8])->get();
User类继承自Model类:Illuminate\Database\Eloquent\Model
当User类静态调用where方法时,自动调用了Model里的魔术方法:
public static function __callStatic($method, $parameters)
{
$instance = new static; //这里的$instance就是User类的实例对象 return call_user_func_array([$instance, $method], $parameters);
}
相当于调用了user对象的where方法,这时就又调用了魔术方法:
public function __call($method, $parameters)
{
if (in_array($method, ['increment', 'decrement'])) {
return call_user_func_array([$this, $method], $parameters);
} $query = $this->newQuery(); //返回Illuminate\Database\Eloquent\Builder对象 return call_user_func_array([$query, $method], $parameters);
}
相当于调用Illuminate\Database\Eloquent\Builder对象里的where方法和get方法,这两个方法里其实
其实是封装调用了Illuminate\Database\Query\Builder对象里的where方法和get方法->get方法里调用了runselect方法 runSelect方法:
/**
* Run the query as a "select" statement against the connection.
*
* @return array
*/
protected function runSelect()
{
return $this->connection->select($this->toSql(), $this->getBindings(), ! $this->useWritePdo); //调用connection 对象的select方法
}
再看connection对象是怎么传到Illuminate\Database\Eloquent\Builder类实例里的:
Model类的newQuery方法:
/**
* Get a new query builder for the model's table.
*
* @return \Illuminate\Database\Eloquent\Builder
*/
public function newQuery()
{
$builder = $this->newQueryWithoutScopes(); return $this->applyGlobalScopes($builder);
}
Model类的newQueryWithoutScopes方法:
/**
* Get a new query builder that doesn't have any global scopes.
*
* @return \Illuminate\Database\Eloquent\Builder|static
*/
public function newQueryWithoutScopes()
{
$builder = $this->newEloquentBuilder(
$this->newBaseQueryBuilder() //这个方法返回
); // Once we have the query builders, we will set the model instances so the
// builder can easily access any information it may need from the model
// while it is constructing and executing various queries against it.
return $builder->setModel($this)->with($this->with);
}
Model类的newBaseQueryBuilder方法实现
/**
* Get a new query builder instance for the connection.
*
* @return \Illuminate\Database\Query\Builder
*/
protected function newBaseQueryBuilder()
{
$conn = $this->getConnection(); \\连接数据库并返回connection对象 $grammar = $conn->getQueryGrammar(); return new QueryBuilder($conn, $grammar, $conn->getPostProcessor()); //Illuminate\Database\Query\Builder }
Model类的$resolver属性(连接解析器)的设定是通过
Illuminate\Database\DatabaseServiceProvider 里的boot方法设置的
这样Model类的getConnection方法实际调用的DatabaseManager类的connection方法,返回connection类实例
如何创建的数据库连接:
Model类getConnection方法->DatabaseManager类connection方法->
->ConnectionFactory类的createSingleConnection()
/**
* Create a single database connection instance.
*
* @param array $config
* @return \Illuminate\Database\Connection
*/
protected function createSingleConnection(array $config)
{
//创建连接器对象并连接数据库返回pdo对象
$pdo = $this->createConnector($config)->connect($config);
//传入PDO对象、并返回connection对象,connection对象负责查询数据库
return $this->createConnection($config['driver'], $pdo, $config['database'], $config['prefix'], $config); }
laravel5.1框架model类查询实现的更多相关文章
- 为测试框架model类自动生成xml结果集
问题:有大量类似于theProductId这样名字的字符串需要转换成the_product_id这种数据库column名的形式. 思路:见到(见)大写字母(缝)就插入(插)一个“_”字符(针)进去,最 ...
- tp框架之Model类与命名空间
1.获取系统常量信息 public function shuchu() { var_dump(get_defined_constants()); } 2.跨控制器或跨模块调用 function dia ...
- J2EE进阶(七)利用SSH框架根据数据表建立model类
J2EE进阶(七)利用SSH框架根据数据表建立model类 前言 在利用SSH框架进行项目开发时,若将数据库已经建好,并且数据表之间的依赖关系已经确定,可以利用Hibernate的反转功能进行mode ...
- 构建自己的PHP框架--实现Model类(3)
在之前的博客中,我们实现并完善了Model类的findOne方法,下面我们来实现其中的其他方法. 先来看findAll方法,这个方法和findOne很相似. public static functio ...
- 构建自己的PHP框架--实现Model类(1)
在之前的博客中,我们定义了ORM的接口,以及决定了使用PDO去实现.最后我们提到会有一个Model类实现ModelInterface接口. 现在我们来实现这个接口,如下: <?php names ...
- yii框架之gii创建数据表相应的model类
一.首先是在数据库中建立project须要的表: 二.然后,配置相应文件: 在project文件夹下yiiProject\protected\config\main.php.在50行定义了db应用组件 ...
- tp框架-----Model模型层
1.Model模型层是用来做什么的呢? 主要是用来做操作数据库访问的.也就说明TP框架自带了一种访问数据库的方式,使用的是Model模型. 2.Model模型怎样使用呢? 要使用Model模型层访问数 ...
- odoo 基于SQL View视图的model类
在做odoo的过程中,会涉及到多表的查询, 尤其是做报表的时候这种情况更甚,这样下来会做很多的关联,不是很方便.odoo提供了一种机制,即基于视图的model类.代码地址在这里. 具体过程如下: 1. ...
- Django框架 之 ORM查询操作详解
Django框架 之 ORM查询操作详解 浏览目录 一般操作 ForeignKey操作 ManyToManyField 聚合查询 分组查询 F查询和Q查询 事务 Django终端打印SQL语句 在Py ...
随机推荐
- Codeforces Round #604 (Div. 2) D. Beautiful Sequence(构造)
链接: https://codeforces.com/contest/1265/problem/D 题意: An integer sequence is called beautiful if the ...
- YAML_09 脚本调用变量+触发器
ansible]# vim adhttp2.yml --- - hosts: cache remote_user: root vars: server: httpd tasks: ...
- QSetting介绍
简介 QSettings类提供了持久的跨平台应用程序设置. 用户通常期望应用程序记住它的设置(窗口大小.位置等)所有会话.这些信息通常存储在Windows系统注册表,OS X和iOS的属性列表文件中. ...
- logo的一般做法
<body> <!-- h1里面嵌套a,并且有网站名,方便seo --> <h1> <a href="#">小米官网</a&g ...
- Kindle Touch 修砖手札
首先是网上的修砖教程: 最近有多人反映按照修砖程序走过后依然板砖,和碎平联系和WA沟通后对帖子作新的修改. 新教程直接使用5.1.2的镜像,特别说明. 特别感谢kn007的专业指导 小白帖子现为简化过 ...
- 常用spaceclaim脚本
#创建一个长方体,通过两点来确定一个立方体 #MM表示的是以毫米作为单位 #返回的是一个BlockBody的对象 #本函数还有第三个参数可选,分别代表增加材料,切除材料等等 #默认值为增加材料 注:第 ...
- hdoj 1010-Tempter of the Bone
Problem Description The doggie found a bone in an ancient maze, which fascinated him a lot. However, ...
- LCT 总结
刚开始学lct花了一晚上研究模板,调出来就感觉不怎么难打了. 对板子的浅显理解: lct维护树形联通块,通过splay维护实链,可以把需要的路径变换到一颗splay上维护. splay中的关系只依赖实 ...
- linux 9.故障修复和网络配置
一.linux系统故障修复 1.不知道root密码的前提下 破解root密码 服务器必须在身边 grub引导菜单 按任意键进入->e ( ...
- WINDOWS和LINUX相互传文件WINSCP
WINDOWS和LINUX相互传文件WINSCP 下载并安装WINSCP程序. 左边是WINDOWS文件目录,右边是LINUX目录,选中文件,鼠标拖曳就可以传文件,非常方便.