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代码
Apr 09 PHP
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
Sep 30 PHP
preg_match_all使用心得分享
Jan 31 PHP
php实现水仙花数的4个示例分享
Apr 08 PHP
php判断文件夹是否存在不存在则创建
Apr 09 PHP
微信随机生成红包金额算法php版
Jul 21 PHP
php读取本地json文件的实例
Mar 07 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
PHP 对象接口简单实现方法示例
Apr 13 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
Aug 11 PHP
TP5多入口设置实例讲解
Dec 15 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
根德Grundig S400/S500/S700电路分析
2021/03/02 无线电
PHP 的几个配置文件函数
2006/12/21 PHP
php正则表达式(regar expression)
2011/09/10 PHP
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
2011/09/19 Javascript
页面调用单个swf文件,嵌套出多个方法。
2011/11/21 Javascript
js图片自动切换效果处理代码
2013/05/07 Javascript
JS对话框_JS模态对话框showModalDialog用法总结
2014/01/11 Javascript
jquery操作 iframe的方法
2014/12/03 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
2016/01/12 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
微信小程序 参数传递实例代码
2017/03/20 Javascript
react实现菜单权限控制的方法
2017/12/11 Javascript
一次记住JavaScript的6个正则表达式方法
2018/02/22 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
Vue2(三)实现子菜单展开收缩,带动画效果实现方法
2019/04/28 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
Vue的transition-group与Virtual Dom Diff算法的使用
2019/12/09 Javascript
微信小程序点击按钮动态切换input的disabled禁用/启用状态功能
2020/03/07 Javascript
vue实现图片上传到后台
2020/06/29 Javascript
[01:56]2014DOTA2西雅图邀请赛 MVP外卡赛老队长精辟点评
2014/07/09 DOTA
python 将字符串转换成字典dict
2013/03/24 Python
Django中URLconf和include()的协同工作方法
2015/07/20 Python
在windows下快速搭建web.py开发框架方法
2016/04/22 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
详解Python最长公共子串和最长公共子序列的实现
2018/07/07 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
python3.x+pyqt5实现主窗口状态栏里(嵌入)显示进度条功能
2019/07/04 Python
关于numpy.where()函数 返回值的解释
2019/12/06 Python
香港钟表珠宝首饰商城:OneMallTime网摩间
2016/10/14 全球购物
教学器材管理制度
2014/01/26 职场文书
精通CAD能手自荐书
2014/01/31 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
党的群众路线教育实践活动对照检查材料(教师)
2014/09/24 职场文书
结婚喜宴迎宾词
2015/08/10 职场文书
民事纠纷协议书
2016/03/23 职场文书