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截断标题且兼容utf8和gb2312编码
Sep 22 PHP
PHP无限分类(树形类)
Sep 28 PHP
PHP禁止个别IP访问网站
Oct 30 PHP
5种PHP创建数组的实例代码分享
Jan 17 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
php删除数组中重复元素的方法
Dec 22 PHP
实例讲解如何在PHP的Yii框架中进行错误和异常处理
Mar 17 PHP
Yii数据模型中rules类验证器用法分析
Jul 15 PHP
thinkPHP多表查询及分页功能实现方法示例
Jul 03 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
Laravel5.7框架安装与使用学习笔记图文详解
Apr 02 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
Dec 31 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实现的通用图片处理类
2015/03/24 PHP
php 微信公众平台开发模式实现多客服的实例代码
2016/11/07 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
jQuery的缓存机制浅析
2014/06/07 Javascript
javascript运动详解
2015/07/06 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
vue实现单选和多选功能
2017/08/11 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
React组件内事件传参实现tab切换的示例代码
2018/07/04 Javascript
微信小程序实现上传照片代码实例解析
2020/08/04 Javascript
[06:42]DOTA2每周TOP10 精彩击杀集锦vol.1
2014/06/25 DOTA
Python数据库的连接实现方法与注意事项
2016/02/27 Python
Python函数中的函数(闭包)用法实例
2016/03/15 Python
python3使用SMTP发送HTML格式邮件
2018/06/19 Python
详解python中的装饰器
2018/07/10 Python
谈谈Python中的while循环语句
2019/03/10 Python
python设置环境变量的作用和实例
2019/07/09 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
pytorch 状态字典:state_dict使用详解
2020/01/17 Python
Python使用QQ邮箱发送邮件实例与QQ邮箱设置详解
2020/02/18 Python
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
TripAdvisor德国:全球领先的旅游网站
2017/12/07 全球购物
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
全球性的在线鞋类品牌:Public Desire
2019/04/03 全球购物
法定代表人身份证明书(含说明)
2014/10/02 职场文书
2014年质检员工作总结
2014/11/18 职场文书
行政经理岗位职责
2015/04/15 职场文书
幼儿园教师师德师风承诺书
2015/04/28 职场文书
初中教师德育工作总结2015
2015/05/12 职场文书
外出考察学习心得体会
2016/01/18 职场文书
导游词之西江千户苗寨
2019/12/24 职场文书
Python中Cookies导出某站用户数据的方法
2021/05/17 Python
浅谈pytorch中stack和cat的及to_tensor的坑
2021/05/20 Python