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 截取字符串并以零补齐str_pad() 函数
May 07 PHP
PHP备份数据库生成SQL文件并下载的函数代码
Feb 05 PHP
探讨:如何编写PHP扩展
Jun 13 PHP
php中unserialize返回false的解决方法
Sep 22 PHP
解析WordPress中控制用户登陆和判断用户登陆的PHP函数
Mar 01 PHP
php分页查询的简单实现代码
Mar 14 PHP
laravel自定义分页效果
Jul 23 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
PHP通过bypass disable functions执行系统命令的方法汇总
May 02 PHP
thinkphp3.2框架中where条件查询用法总结
Aug 13 PHP
浅谈Laravel模板实体转义带来的坑
Oct 22 PHP
Yii框架 session 数据库存储操作方法示例
Nov 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
Protoss兵种对照表
2020/03/14 星际争霸
php下通过伪造http头破解防盗链的代码
2010/07/03 PHP
PHP中的integer类型使用分析
2010/07/27 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
深入剖析浏览器退出之后php还会继续执行么
2016/05/17 PHP
如何离线执行php任务
2017/02/21 PHP
PHP实现八皇后算法
2019/05/06 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
jQuery 淡入淡出 png图在ie8下有黑色边框的解决方法
2013/03/05 Javascript
js控制表单操作的常用代码小结
2013/08/15 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
javaScript封装的各种写法
2017/08/14 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
2020/10/19 Javascript
Python yield 小结和实例
2014/04/25 Python
python复制文件的方法实例详解
2015/05/22 Python
Django中使用group_by的方法
2015/05/26 Python
python 对象和json互相转换方法
2018/03/22 Python
python开启摄像头以及深度学习实现目标检测方法
2018/08/03 Python
Django框架视图函数设计示例
2019/07/29 Python
Alpine安装Python3依赖出现的问题及解决方法
2020/12/25 Python
Larsson & Jennings官网:现代瑞士钟表匠
2018/03/20 全球购物
J2EE是技术还是平台还是框架
2016/08/14 面试题
电子商务专业实习生自我鉴定
2013/09/24 职场文书
优秀毕业生自我鉴定
2014/02/11 职场文书
如何写自我鉴定
2014/03/19 职场文书
青年安全生产示范岗事迹材料
2014/05/04 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
大学考试作弊检讨书
2015/05/06 职场文书
大学生心理健康教育心得体会
2016/01/12 职场文书
读鲁迅先生的经典名言
2019/08/20 职场文书
mysql 获取时间方式
2022/03/20 MySQL