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 5.0对象模型深度探索之属性和方法
Mar 27 PHP
php 在线打包_支持子目录
Jun 28 PHP
[原创]效率较高的php下读取文本文件的代码
Jul 02 PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 PHP
PHP转盘抽奖接口实例
Feb 09 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
php数据访问之查询关键字
May 09 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
Zend Framework基于Command命令行建立ZF项目的方法
Feb 18 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
Sep 21 PHP
PHP 中魔术常量的实例详解
Oct 26 PHP
PHP PDOStatement::bindColumn讲解
Jan 30 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为SHOPEX增加日志功能代码
2010/07/02 PHP
php命令行用法入门实例教程
2014/10/27 PHP
可兼容php5与php7的cURL文件上传功能实例分析
2018/05/11 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
2006/06/26 Javascript
js常用函数 不错
2006/09/08 Javascript
jquery获取input表单值的代码
2010/04/19 Javascript
jquery 事件对象属性小结
2010/04/27 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
JS使用oumousemove和oumouseout动态改变图片显示的方法
2015/03/31 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
js库Modernizr的介绍和使用
2015/05/07 Javascript
AngularJS的内置过滤器详解
2015/05/14 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
jQuery基于toggle实现click触发DIV的显示与隐藏问题分析
2016/06/12 Javascript
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
vue中axios请求的封装实例代码
2019/03/23 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python实现PS图像调整黑白效果示例
2018/01/25 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析
2019/08/15 Python
pandas factorize实现将字符串特征转化为数字特征
2019/12/19 Python
python查找特定名称文件并按序号、文件名分行打印输出的方法
2020/04/24 Python
PHP面试题集
2016/12/18 面试题
干部下基层实施方案
2014/03/14 职场文书
行政专员求职信范文
2014/05/03 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
党员剖析材料范文
2014/12/18 职场文书
银行实习推荐信
2015/03/27 职场文书
行政上诉状范文
2015/05/23 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
Python预测分词的实现
2021/06/18 Python
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers