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设计聊天室步步通
Oct 09 PHP
转换中文日期的PHP程序
Oct 09 PHP
解析php如何将日志写进syslog
Jun 28 PHP
php调用C代码的实现方法
Mar 11 PHP
PHP文件锁定写入实例解析
Jul 14 PHP
PHP多进程编程实例
Oct 15 PHP
smarty内置函数section的用法
Jan 22 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
Feb 22 PHP
PHP微信红包生成代码分享
Oct 06 PHP
php格式文件打开的四种方法
Feb 24 PHP
PHP实现的简单路由和类自动加载功能
Mar 13 PHP
laravel5 Eloquent 实现事务方式
Oct 21 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
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
Yii框架where查询用法实例分析
2019/10/22 PHP
基于PHP+Mysql简单实现了图书购物车系统的实例详解
2020/08/06 PHP
改版了网上的一个js操作userdata
2007/04/27 Javascript
Textbox控件注册回车事件及触发按钮提交事件具体实现
2013/03/04 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
深入浅析JS的数组遍历方法(推荐)
2016/06/15 Javascript
Bootstrap字体图标无法正常显示的解决方法
2016/10/08 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
JS实现在文本指定位置插入内容的简单示例
2017/12/22 Javascript
利用JS判断客户端类型你应该知道的四种方法
2017/12/22 Javascript
iview实现select tree树形下拉框的示例代码
2018/12/21 Javascript
Vue+Element UI+Lumen实现通用表格分页功能
2019/02/02 Javascript
[37:37]DAC2018 4.4 淘汰赛 Optic vs Mineski 第二场
2018/04/05 DOTA
[08:40]Navi Vs Newbee
2018/06/07 DOTA
对pandas处理json数据的方法详解
2019/02/08 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
flask的orm框架SQLAlchemy查询实现解析
2019/12/12 Python
基于Python脚本实现邮件报警功能
2020/05/20 Python
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
银行求职信个人范文
2013/12/16 职场文书
小学庆六一活动方案
2014/02/28 职场文书
前台文员职责范本
2014/03/07 职场文书
给老婆的保证书范文
2014/04/28 职场文书
综合实践活动总结
2014/05/05 职场文书
习总书记三严三实学习心得体会
2014/10/13 职场文书
搞笑婚前保证书
2015/02/28 职场文书
小学生读书笔记
2015/07/01 职场文书
生日宴会家属答谢词
2015/09/29 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
go mod 安装依赖 unkown revision问题的解决方案
2021/05/06 Golang
利用Selenium添加cookie实现自动登录的示例代码(fofa)
2021/05/08 Python
Java使用httpRequest+Jsoup爬取红蓝球号码
2021/07/02 Java/Android
mysql sql常用语句大全
2022/06/21 MySQL