在看 TP框架的帮助文档的时候 看到一个很有意思的功能---字段的动态查询
官方是这么描述的
ThinkPHP提供了数据癿劢态查询方法,可以简化你癿查询代码,例如: $User->where('name="ThinkPHP"')->find(); 可以简化为: $User->getByName('ThinkPHP'); $User->where('email="thinkphp@qq.com"')->find();
第一感觉 是 getBy后面的内容是字段名字 于是乎 就翻开Model类源码去看了看
果不其然..发现了一个 魔术函数 __CALL;
__call 函数是 在用对象访问一个该类不存在的方法时调用的函数
系统会自动把方法名和 参数都传到 __call方法中
TP是这么定义的
/** +---------------------------------------------------------- * 利用__call方法实现一些特殊的Model方法 (魔术方法) +---------------------------------------------------------- * @access public +---------------------------------------------------------- * @param string $method 方法名称 * @param array $args 调用参数 +---------------------------------------------------------- * @return mixed +---------------------------------------------------------- */ public function __call($method,$args) { if(in_array(strtolower($method),array('field','table','where','order','limit','page','having','group','lock','distinct'),true)) { // 连贯操作的实现 $this->options[strtolower($method)] = $args[0]; return $this; }elseif(in_array(strtolower($method),array('count','sum','min','max','avg'),true)){ // 统计查询的实现 $field = isset($args[0])?$args[0]:'*'; return $this->getField(strtoupper($method).'('.$field.') AS tp_'.$method); }elseif(strtolower(substr($method,0,5))=='getby') { // 根据某个字段获取记录 $field = parse_name(substr($method,5)); $options['where'] = $field.'=/''.$args[0].'/''; return $this->find($options); }else{ throw_exception(__CLASS__.':'.$method.L('_METHOD_NOT_EXIST_')); return; } }
仔细阅读代码
它提供了三种方式 如果都不符合直接报错提示
第一种
if(in_array(strtolower($method),array('field','table','where','order','limit','page','having','group','lock','distinct'),true)) { // 连贯操作的实现 $this->options[strtolower($method)] = $args[0]; return $this; }
应该能看懂吧...
_call把捕获的方法及其参数传递进来
判断 $method是否在允许的数组中,如果存在 将参数赋给$this->option变量
然后返回 $this对象
这是什么意思?
我测试了一下 代码如下 $Form = M("Form"); $data= $Form->order('id desc')->limit(6)->select();
按照 __call函数 第一种解释就是
$Form->order('id desc') 执行之后
$this->option变量会变成
$this->option['order']='id desc',
然后 会返回$this对象
变成
$this->option['limit']='6',
然后会执行SQL去搜索数据
第二种就是
elseif(in_array(strtolower($method),array('count','sum','min','max','avg'),true)){ // 统计查询的实现 $field = isset($args[0])?$args[0]:'*'; return $this->getField(strtoupper($method).'('.$field.') AS tp_'.$method); }
这个的意思就是
如果符合array('count','sum','min','max','avg'),true)
会将参数作为 sql语句的搜索字段 ,如果没有 默认就是 星
也就是 SELECT count(*)|sum(*)|min(*)|max(*)|avg(*) ********返回给数据
第三种就是咱们前面说的
elseif(strtolower(substr($method,0,5))=='getby') { // 根据某个字段获取记录 $field = parse_name(substr($method,5)); $options['where'] = $field.'=/''.$args[0].'/''; return $this->find($options); }
这句代码会将 $User->getby* 中的*作为where 语句的参数来执行
假如说 代码为
$User->getByUsername("siren");
那么 通过__call执行之后形成的语句就是
select * from table where username="siren"
就是这样..如果有错的地方 欢迎提出来..