laravel5.1框架model类查询的实现方法

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类查询的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Laravel框架实现model层的增删改查(CURD)操作示例

    本文实例讲述了Laravel框架实现model层的增删改查(CURD)操作.分享给大家供大家参考,具体如下: protected $table = 'user_city'; public $timestamps = false; //添加 返回id public function cityadd($data) { return $this->insertGetId($data); } //单条查找 public function getfind($id) { if($this->where('

  • Laravel框架模型的创建及模型对数据操作示例

    本文实例讲述了Laravel框架模型的创建及模型对数据操作.分享给大家供大家参考,具体如下: 模型创建: <?php namespace App; use Illuminate\Database\Eloquent\Model; class Admin extends Model{ //指定表名 protected $table = 'wd_user'; //指定允许批量复制的字段 protected $fillable = ['username']; //指定id protected $prim

  • laravel5.1框架model类查询的实现方法

    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类的实例对象

  • thinkPHP5框架实现分页查询功能的方法示例

    本文实例讲述了thinkPHP5框架实现分页查询功能的方法.分享给大家供大家参考,具体如下: controller文件内Admin.php <?php namespace app\admin\controller; use think\Controller; use app\admin\model\Admin as AdminModel; //使用分页类 取别名解决类名冲突 class Admin extends Controller{ public function lst(){ /* 分页开

  • laravel5.1框架下的批量赋值实现方法分析

    本文实例讲述了laravel5.1框架下的批量赋值实现方法.分享给大家供大家参考,具体如下: 官方中文文档在这里: http://laravel-china.org/docs/5.1/eloquent#%E6%89%B9%E9%87%8F%E8%B5%8B%E5%80%BC 我先来说明一下一个场景: 你想要往数据库中存评论,在控制器的代码如下: $comment->comment_id= $id; $comment->title = $name; $comment->url = $url

  • Laravel5.4框架中视图共享数据的方法详解

    本文实例讲述了Laravel5.4框架中视图共享数据的方法.分享给大家供大家参考,具体如下: 每个人都会遇到这种情况:某些数据还在每个页面进行使用,比如用户信息,或者菜单数据,最基本的做法是在每个视图空控制器中传入这些数据,但显然并不是我们想要的结果.另一种方法就是使用视图数据共享,视图数据共享的基本使用很简单,可查看视图文档了解详情,这里我们演示两个使用示例:在视图间共享数据和视图Composer 在视图中共享数据 除了在单个视图中传递指定数据之外,有时候需要在所有视图中传入同一数据,即我们需

  • Python使用Flask框架获取当前查询参数的方法

    本文实例讲述了Python使用Flask框架获取当前查询参数的方法.分享给大家供大家参考.具体如下: 这段代码实现Python的Flask框架下获取当前查询参数,即QueryString中的所有参数 from flask import Flask, render_template, request # Initialize the Flask application app = Flask(__name__) # This is a catch all route, to catch any r

  • Django框架model模型对象验证实现方法分析

    本文实例讲述了Django框架model模型对象验证实现方法.分享给大家供大家参考,具体如下: 模型对象的验证 验证一个模型涉及三个步骤: 验证模型的字段 -- Model.clean_fields() 验证模型的完整性 -- Model.clean() 验证模型的唯一性 -- Model.validate_unique() 当调用模型的full_clean() 方法时,这三个方法都将执行.当使用ModelForm时,is_valid() 将为表单中的所有字段执行这些验证.如果你计划自己处理验证

  • JAVA集合框架工具类自定义Collections集合方法

    项目中有需要多次统计 某些集合中 的某个属性值,所以考虑封装一个方法,让其其定义实现计算方式. 话不多说,看代码: 1.封装的自定义集合工具类:CollectionsCustom package com.test.util; import java.util.Collection; import org.apache.commons.collections.CollectionUtils; /** * 自定义集合处理类 */ public class CollectionsCustom { /*

  • Laravel5.1 框架数据库查询构建器用法实例详解

    本文实例讲述了Laravel5.1 框架数据库查询构建器用法.分享给大家供大家参考,具体如下: 今儿个咱说说查询构建器.它比运行原生SQL要简单些,它的操作面儿也是比较广泛的. 1 查询结果 先来看看它的语法: public function getSelect() { $result = DB::table('articles')->get(); dd($result); } 查询构建器就是通过table方法返回的,使用get()可以返回一个结果集(array类型) 这里是返回所有的数据,当然

  • Laravel5.1 框架模型查询作用域定义与用法实例分析

    本文实例讲述了Laravel5.1 框架模型查询作用域定义与用法.分享给大家供大家参考,具体如下: 所谓的查询作用域就是允许你自定义一个查询语句 把它封装成一个方法. 1 定义一个查询作用域 定义查询作用域就是在模型中声明一个scope开头的方法: public function scopeHotArticle($query) { return $query->orderBy('comment_count','desc')->first(); } 然后可以这样使用: public functi

  • laravel5.6框架操作数据curd写法(查询构建器)实例分析

    本文实例讲述了laravel5.6框架操作数据curd写法(查询构建器).分享给大家供大家参考,具体如下: laravel5.6 数据库操作-查询构建器 <?php //laravel5.6 语法 demo示例 namespace App\Http\Controllers;//命名该控制App空间下名称 use Illuminate\Support\Facades\DB;//使用DB操作数据库 use App\Http\Controllers\Controller;//继承基础控制器 class

随机推荐