您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息
免费发信息

DB Facade 中的 select 方法分解

2024/3/29 17:27:28发布5次查看
前言 laravel 框架中的查询构造器相当的强大,可能是我的基础太差。当我看到 db facade 中的 select 方法时一时不能理解,于是就有了这篇文章。
select()方法的2种使用 1. 链式调用: $users = db::table('users')->select('uname, realname')->get();
通过 laravel debugbar 上面这句代码执行的sql是:
select `uname`, `realname` from `users`
2. 静态调用: $sql = select uname, realname from users;$users = db::select($sql);
这种方式,执行的sql语句跟链式调用执行语句是一样的。
分解 据其文档描述table()会针对指定的数据表返回一个查询构造器实例,追踪到 db facade 类中
--文件位置 framework/src/illuminate/support/facades/db.php namespace illuminate\support\facades;/*** @see \illuminate\database\databasemanager* @see \illuminate\database\connection*/class db extends facade{ /** * get the registered name of the component. * * @return string */ protected static function getfacadeaccessor() { return 'db'; }}
这个文件中根本没有table()这个静态方法,但是这个类继承了 facade 这个类
laravel 中的 facades laravel facade 是一种为容器内部服务提供类型静态接口的类。据其文档描述,facades 是可触及容器服务底层实现方式的代理。使用 facade 类的好处是让开发者使用服务是更加便捷。
facade 类中包含一个名为 $app的私有属性,其值为服务容器的引用。
__callstatic魔术方法用于处理实际并不存在的静态方法的调用。因为 facade 类并未实现该方法。因此,__callstatic 会从容器获取各自的服务,进而调用。
__callstatic 方法具体实现:
--!文件位置 framework/src/illuminate/support/facades/facade.php /**+ handle dynamic, static calls to the object.*+ @param string $method+ @param array $args+ @return mixed*/public static function __callstatic($method, $args){ $instance = static::getfacaderoot(); if (! $instance) { throw new runtimeexception('a facade root has not been set.'); } switch (count($args)) { case 0: return $instance->$method(); case 1: return $instance->$method($args[0]); case 2: return $instance->$method($args[0], $args[1]); case 3: return $instance->$method($args[0], $args[1], $args[2]); case 4: return $instance->$method($args[0], $args[1], $args[2], $args[3]); default: return call_user_func_array([$instance, $method], $args); }}
通过 $instance = static::getfacaderoot()来得到调用该方法的所属实例
public static function getfacaderoot(){ return static::resolvefacadeinstance(static::getfacadeaccessor());}
在 db facade中 已实现 getfacadeaccessor()该方法 return 'db'。
protected static function resolvefacadeinstance($name){ if (is_object($name)) { return $name; } if (isset(static::$resolvedinstance[$name])) { return static::$resolvedinstance[$name]; } return static::$resolvedinstance[$name] = static::$app[$name];}
通过 __callstatic() 及 static::后期静态绑定。实现了这个伪静态的调用。这也就明白了为什么可以通过静态方法调用db::select()。
我们再回到第一种调用方式:
--文件位置 #illuminate\database\querypublic function select($colums = ['*']){ $this->columns = is_array($columns) ? $columns : func_get_args(); return $this;}
通过源码可以看出 select 是个可变参数函数,默认接收一个数组。
总结 通过对 select 的分解,我们也可知道其他 facades 中方法的运作原理。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录