laravel5.1框架model类查询的实现方法


Posted in PHP onOctober 08, 2019

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类查询的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
层叠菜单的动态生成
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(1)
Oct 09 PHP
php自动获取目录下的模板的代码
Aug 08 PHP
PHP操作数组的一些函数整理介绍
Jul 17 PHP
php变量范围介绍
Oct 15 PHP
获取PHP警告错误信息的解决方法
Jun 03 PHP
避免Smarty与CSS语法冲突的方法
Mar 02 PHP
PHP测试成功的邮件发送案例
Oct 26 PHP
网页的分页下标生成代码(PHP后端方法)
Feb 03 PHP
PHP编写daemon process详解及实例代码
Sep 30 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 PHP
PHP反射基础知识回顾
Sep 10 PHP
在laravel框架中使用model层的方法
Oct 08 #PHP
Laravel-添加后台模板AdminLte的实现方法
Oct 08 #PHP
PHP7.3.10编译安装教程
Oct 08 #PHP
PHP使用redis位图bitMap 实现签到功能
Oct 08 #PHP
laravel-admin自动生成模块,及相关基础配置方法
Oct 08 #PHP
laravel-admin表单提交隐藏一些数据,回调时获取数据的方法
Oct 08 #PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 #PHP
You might like
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
PHPExcel内存泄漏问题解决方法
2015/01/23 PHP
给WordPress的编辑后台添加提示框的代码实例分享
2015/12/25 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
javascript xml为数据源的下拉框控件
2009/07/07 Javascript
深入理解JavaScript中为什么string可以拥有方法
2016/05/24 Javascript
AngularJs学习第八篇 过滤器filter创建
2016/06/08 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
在vue项目创建的后初始化首次使用stylus安装方法分享
2018/01/25 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
js校验开始时间和结束时间
2020/05/26 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
[01:11:08]Winstrike vs NB 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python Mysql数据库操作 Perl操作Mysql数据库
2009/01/12 Python
用Python进行基础的函数式编程的教程
2015/03/31 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
python实现生成字符串大小写字母和数字的各种组合
2019/01/01 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
Python : turtle色彩控制实例详解
2020/01/19 Python
python GUI库图形界面开发之PyQt5打开保存对话框QFileDialog详细使用方法与实例
2020/02/27 Python
戴尔美国官网:Dell
2016/08/31 全球购物
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
艾滋病宣传标语
2014/06/25 职场文书
努力工作保证书
2015/02/28 职场文书
格列佛游记读书笔记
2015/06/30 职场文书
导游词之无锡丝业博物馆
2019/11/12 职场文书
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
简单聊一聊SQL注入及防止SQL注入
2022/03/23 MySQL