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 相关文章推荐
动态网站web开发 PHP、ASP还是ASP.NET
Oct 09 PHP
Optimizer与Debugger兼容性问题的解决方法
Dec 01 PHP
PHP通过session id 实现session共享和登录验证的代码
Jun 03 PHP
使用PHPMailer实现邮件发送代码分享
Oct 23 PHP
浅谈PHP中JSON数据操作
Jul 01 PHP
PHPStorm+XDebug进行调试图文教程
Jun 13 PHP
基于php实现的验证码小程序
Dec 13 PHP
PHP中include和require的区别实例分析
May 07 PHP
详解Laravel5.6 Passport实现Api接口认证
Jul 27 PHP
PHP封装请求类实例分析【基于Yii框架】
Oct 17 PHP
php 多继承的几种常见实现方法示例
Nov 18 PHP
一文搞懂php的垃圾回收机制
Jun 18 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数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
PHP中使用GD库绘制折线图 折线统计图的绘制方法
2015/11/09 PHP
让你的PHP7更快之Hugepage用法分析
2016/05/31 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
2018/04/04 PHP
JavaScript入门教程(6) Window窗口对象
2009/01/31 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
为什么要在引入的css或者js文件后面加参数的详细讲解
2013/05/03 Javascript
通过javascript获取iframe里的值示例代码
2013/06/24 Javascript
javascript 用函数语句和表达式定义函数的区别详解
2014/01/06 Javascript
jquery 使用简明教程
2014/03/05 Javascript
js弹出确认是否删除对话框
2014/03/27 Javascript
js精准的倒计时函数分享
2016/06/29 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
js中setTimeout的妙用--防止循环超时
2017/03/06 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
Angular2进阶之如何避免Dom误区
2018/04/02 Javascript
[36:37]2014 DOTA2华西杯精英邀请赛5 24 VG VS iG
2014/05/25 DOTA
[49:28]VP vs Optic 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
Python ftp上传文件
2016/02/13 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
python实现一组典型数据格式转换
2018/12/15 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
html5使用canvas实现跟随光标跳动的火焰效果
2014/01/07 HTML / CSS
自荐信模版
2013/10/24 职场文书
药品业务员岗位职责
2014/04/17 职场文书
经贸专业毕业生求职信范文
2014/05/01 职场文书
教师党员自我评议不足范文
2014/10/19 职场文书
地道战观后感300字
2015/06/04 职场文书
2015重阳节敬老活动总结
2015/07/29 职场文书
数据设计之权限的实现
2022/08/05 MySQL