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 相关文章推荐
PHP获取网站域名和地址的代码
Aug 17 PHP
php的curl实现get和post的代码
Aug 23 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
PHP-redis中文文档介绍
Feb 07 PHP
基于php常用函数总结(数组,字符串,时间,文件操作)
Jun 27 PHP
xss防御之php利用httponly防xss攻击
Mar 21 PHP
Smarty模板学习笔记之Smarty简介
May 20 PHP
PHP的魔术常量__METHOD__简介
Jul 08 PHP
laravel migrate初学常见错误的解决方法
Oct 11 PHP
PHP实现提高SESSION响应速度的几种方法详解
Aug 09 PHP
laravel解决迁移文件一次删除创建字段报错的问题
Oct 24 PHP
Yii框架学习笔记之应用组件操作示例
Nov 13 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实现简单洗牌算法
2013/06/18 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
php微信公众号开发之图片回复
2018/10/20 PHP
PHP实现八皇后算法
2019/05/06 PHP
PHP使用Redis实现Session共享的实现示例
2019/05/12 PHP
javascript学习笔记(十八) 获得页面中的元素代码
2012/06/20 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
2013/12/30 Javascript
javascript每日必学之继承
2016/02/23 Javascript
JQuery EasyUI的使用
2016/02/24 Javascript
Javascript 5种方法实现过滤删除前后所有空格
2016/06/22 Javascript
JS+H5 Canvas实现时钟效果
2018/07/20 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
vue用BMap百度地图实现即时搜索功能
2019/09/26 Javascript
vue路由传参三种基本方式详解
2019/12/09 Javascript
vue.js实现照片放大功能
2020/06/23 Javascript
vue.js 输入框输入值自动过滤特殊字符替换中问标点操作
2020/08/31 Javascript
在webstorm中配置less的方法详解
2020/09/25 Javascript
[01:28:43]2014 DOTA2华西杯精英邀请赛5 24 DK VS CIS
2014/05/25 DOTA
详解Python多线程
2016/11/14 Python
简单谈谈Python中的json与pickle
2017/07/19 Python
Python在for循环中更改list值的方法【推荐】
2018/08/17 Python
python日志logging模块使用方法分析
2019/05/23 Python
Python3查找列表中重复元素的个数的3种方法详解
2020/02/13 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
Python hashlib和hmac模块使用方法解析
2020/12/08 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
2021/01/11 Python
蔻驰美国官网:COACH美国
2016/08/18 全球购物
网络技术支持面试题
2013/04/22 面试题
毕业生怎样写好自荐信
2013/11/11 职场文书
出纳工作岗位责任制
2014/02/02 职场文书
加强机关作风建设心得体会
2014/10/22 职场文书
2015年学校财务工作总结
2015/05/19 职场文书
辅导员学期工作总结
2015/08/14 职场文书
关于实现中国梦的心得体会
2016/01/05 职场文书
JavaScript 原型与原型链详情
2021/11/02 Javascript
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers