动态查询:getBy字段名

摘要:
phpnamespaceapp\index\controller;//导入模型类useapp索引模型Staff;ClassIndex{publicfunctionindex(){//1.获取$result=Staff::getByName;//2.获取数据对象$data=$result-˃getData();//3.查看结果转储;}}查看结果:数组{[“id”]=˃int[“name”]=˃string“Li Yunlong”[“sex”]==˃int[“age”]=]int[“salary”]==˃float[“dept”]=]int[“hiredate”]=>string“2005-10-20”}如果要查询其他字段,只需修改方法名称中的字段名称。例如,如果查询年龄为30岁,则方法名称为getByAge。模糊查询有时很有用,但也只能得到结果集的第一条记录。建议将字段值用于精确查询,而不是查询表达式。
http://www.php.cn/php/php-getBy.html

根据字段名动态查询:getBy字段名( )

该方法很有意思,手册的说得很简略,我们根据源码来好好说道说道~~

1. 功能:根据字段值查询记录,且仅返回一条记录

2. 源码:/thinkphp/library/think/db/Query.php

您可能感到奇怪,我们不是在学习模型吗?怎么又折腾回了数据库了?原因很简单:这个动态查询是通过Query类的构造方法实现的:

  • Query.php 构造方法源码:
/**
*利用__call方法实现一些特殊的Model方法
*@accesspublic
*@paramstring$method方法名称
*@paramarray$args调用参数
*@returnmixed
*@throwsDbException
*@throwsException
*/publicfunction__call($method,$args){if(strtolower(substr($method,0,5))=='getby'){//根据某个字段获取记录$field=Loader::parseName(substr($method,5));$where[$field]=$args[0];return$this->where($where)->find();
}elseif(strtolower(substr($method,0,10))=='getfieldby'){//根据某个字段获取记录的某个值$name=Loader::parseName(substr($method,10));$where[$name]=$args[0];return$this->where($where)->value($args[1]);
}else{thrownewException('methodnotexist:'.__CLASS__.'->'.$method);
}
}
  • 与getBy字段名( )相关的代码段:

注释是本人所加,源代码中并没有

//去掉getBy获取字段名,并转为小写后,判断是否存在字段名字符串
if(strtolower(substr($method,0,5))=='getby'){//根据某个字段获取记录$field=Loader::parseName(substr($method,5));//将getBy***()的参数做为where方法的参数$where[$field]=$args[0];//返回查询结果:只返回单条满足条件的记录return$this->where($where)->find();

3. 实例演示:

  • 老规矩,先创建一个模型类:/application/index/mode/Staff.php
<?php
namespaceapp\index\model;//导入模型类usethink\model;classStaffextendsmodel{//自定义模型类代码}

一、任务1:查询姓名name等于"李云龙"的记录

  • 控制器:/application/index/controller/Index.php
<?phpnamespaceapp\index\controller;//导入模型类useapp\index\model\Staff;classIndex{publicfunctionindex(){//1.获取name='李云龙'的【数据对象】
$result=Staff::getByName('李云龙');//2.获取数据对象原始数据
$data=$result->getData();

//3.查看结果
dump($datas);
}
}
  • 查看结果:
array(7){
["id"]=>int(1011)
["name"]=>string(9)"李云龙"
["sex"]=>int(1)
["age"]=>int(49)
["salary"]=>float(10350)
["dept"]=>int(1)
["hiredate"]=>string(10)"2005-10-20"}

如果查询其它字段,只需要修改一下方法名称中的字段名部分即可,如查询年龄=30岁,方法名就是:getByAge(30)。因为方法名称因字段名称变化而变化,所以要动态查询。

二、任务2:查询姓名中含有:'大'字的员工信息

getBy字段名( )方法参数是否支持查询表达式呢?手册并未提及,但是看了源码后,发现有限支持:数组式查询表达式,如:[ 'between',[1010,1020] ] 或者:[ '>',1020 ]

  • 控制器:/application/index/controller/Index.php
<?phpnamespaceapp\index\controller;//导入模型类useapp\index\model\Staff;classIndex{publicfunctionindex(){//1.获取name中包含"大"字符的记录,返回【数据对象】
$result=Staff::getByName(['like','%大%']);//2.获取数据对象原始数据
$data=$result->getData();

//3.查看结果
dump($data);
}
}
  • 查看结果
array(7){
["id"]=>int(1024)
["name"]=>string(9)"鲁大师"
["sex"]=>int(0)
["age"]=>int(60)
["salary"]=>float(1300)
["dept"]=>int(2)
["hiredate"]=>string(10)"2012-09-09"}

4. 总结:

尽管动态查询方法的参数支持查询表达式,但不要比较或范围表达式,因为仅返回第一条满足条件记录,通常是没有意义的。模糊查询有时很有用,但同样也仅获取结果集的首条记录

建议用字段值,进行精准查询,不用要查询表达式。

免责声明:文章转载自《动态查询:getBy字段名》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux基础知识之man手册的使用mybatis中的#和$的区别?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

触发器不能读它的问题

http://space.itpub.net/7728585/viewspace-718992 报错如下: SQL> update GPPAYMENTFUND set attribute5='1' where fundapplyno ='20120314500102010001';update GPPAYMENTFUND set attribute5...

PHP socket 接收 java端口 netty 网络字节序

java 服务端测试代码: @Override public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throwsException { buffer.writeShort(5); buffer.writeI...

如何使用php生成唯一ID的4种方法

php生成唯一ID的应用场景非常普遍,如临时缓存文件名称,临时变量,临时安全码等,uniqid()函数基于以微秒计的当前时间,生成一个唯一的 ID。由于生成唯一ID与微秒时间关联,因此ID的唯一性非常可靠。 生成的唯一ID默认返回的字符串有 13 个字符串长,如果再结合md5()函数,生成的唯一ID可靠性将更高,这种生成的ID比随机性的ID 最大优点在于可...

log4j动态日志级别调整

1. 针对root logger的设置 log4j.rootLogger=INFO, CONSOLELogger.getRootLogger().setLevel(org.apache.log4j.Level.DEBUG) 2. 针对Appender的Appender设置 log4j.appender.CONSOLE.Threshold=DEBUG((o...

解决比较Oracle中CLOB字段问题

解决比较Oracle中CLOB字段问题  Oracle中CLOB和BLOB字段虽说在开发中满足了存放超大内容的要求,但是在一些简单使用中确频频带来麻烦。CLOB中存放的是指针,并不能直接取到实际值。而SQLServer中的text字段就很方便,可以直接拿来与需要的字符串比对,象什么等于呀小于呀Like呀不在话下。可是换成Oracle就麻烦死了,要开辟一个...

hiveql函数笔记(二)

1、数据查询 //提高聚合的性能 SET hive.map.aggr=true; SELECT count(*),avg(salary) FROM employees; //木匾不允许在一个查询语句中使用多于一个的函数(DISTINCT。。。)表达式 SELECT count(DISTINCT symbol) FROM stocks; 表生成函数: exp...