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常用技巧总结(附函数代码)
Feb 04 PHP
解析wamp5下虚拟机配置文档
Jun 27 PHP
thinkphp3查询mssql数据库乱码解决方法分享
Feb 11 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
Apr 30 PHP
php简单实现批量上传图片的方法
May 09 PHP
使用php实现从身份证中提取生日
May 09 PHP
Yii多表联合查询操作详解
Jun 02 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
Apr 19 PHP
ThinkPHP中create()方法自动验证实例
Apr 26 PHP
PHP缓存工具XCache安装与使用方法详解
Apr 09 PHP
PHP二维索引数组的遍历实例分析【2种方式】
Jun 24 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删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
php实现天干地支计算器示例
2014/03/14 PHP
php字符串过滤与替换小结
2015/01/26 PHP
JS随即打乱数组实现代码
2012/12/03 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
JavaScript 基本概念
2015/01/20 Javascript
JS实现下拉菜单赋值到文本框的方法
2015/08/18 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
JS实现HTML标签转义及反转义
2020/04/14 Javascript
微信小程序getPhoneNumber获取用户手机号
2017/09/29 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
python获取网页状态码示例
2014/03/30 Python
python常见数制转换实例分析
2015/05/09 Python
一张图带我们入门Python基础教程
2017/02/05 Python
Unicode和Python的中文处理
2017/03/19 Python
python opencv实现运动检测
2018/07/10 Python
Python之inspect模块实现获取加载模块路径的方法
2018/10/16 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
css3中检验表单的required,focus,valid和invalid样式
2014/02/21 HTML / CSS
HTML5 新事件 小结
2009/07/16 HTML / CSS
宏碁西班牙官网:Acer西班牙
2021/01/08 全球购物
彪马香港官方网上商店:PUMA香港
2020/12/06 全球购物
专业销售业务员求职信
2013/11/18 职场文书
前台文员个人求职信范文
2014/01/05 职场文书
机械操作工岗位职责
2014/08/08 职场文书
开业典礼致辞
2015/07/29 职场文书
2016年学校禁毒宣传活动工作总结
2016/04/05 职场文书
比较node.js和Deno
2021/04/27 Javascript
MySQL中varchar和char类型的区别
2021/11/17 MySQL
app场景下uniapp的扫码记录
2022/07/23 Java/Android