动态查询:getBy字段名
http://www.php.cn/php/php-getBy.html
根据字段名动态查询:getBy字段名( )
该方法很有意思,手册的说得很简略,我们根据源码来好好说道说道~~
1. 功能:根据字段值查询记录,且仅返回一条记录
2. 源码:/thinkphp/library/think/db/Query.php
您可能感到奇怪,我们不是在学习模型吗?怎么又折腾回了数据库了?原因很简单:这个动态查询是通过Query类的构造方法实现的:
- Query.php 构造方法源码:
/**
* 利用__call方法实现一些特殊的Model方法
* @access public
* @param string $method 方法名称
* @param array $args 调用参数
* @return mixed
* @throws DbException
* @throws Exception
*/public function __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 {throw new Exception('method not exist:' . __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
namespace app\index\model;//导入模型类use think\model;class Staff extends model {//自定义模型类代码}
一、任务1:查询姓名name等于"李云龙"的记录
- 控制器:/application/index/controller/Index.php
<?phpnamespace app\index\controller;//导入模型类use app\index\model\Staff;class Index { public function index(){ //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
<?phpnamespace app\index\controller;//导入模型类use app\index\model\Staff;class Index { public function index(){ //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字段名的更多相关文章
- 关于 ThinkPHP5 使用 getBy 字段名方式获取数据
关于 ThinkPHP5 使用 getBy 字段名方式获取数据 有小伙半说怎么全文搜索都没有搜索到 getByName 之类的函数. 其实是在这里.
- SQLSERVER 2008 查询数据字段名类型
SELECT * FROM Master..SysDatabases ORDER BY Name SELECT Name,* FROM Master..SysDatabases where Name= ...
- PL/SQL查询,字段名添加中文别名,查询结果的字段名会显示问号,处理方法:
一开始查询出来的字段名显示的是???,下面说说解决方法(本人也是在网上看到的,算是重复编辑一下): -------------------------------------------------- ...
- 查询mysql字段名和字段注释
select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name='表名' and table_sc ...
- ThinkPHP getBy动态查询
getBy动态查询 ThinkPHP getBy动态查询是一个魔术方法,可以根据某个字段名称动态得到对应的一条数据记录. 根据用户名(username)查询对应的用户资料记录: public func ...
- Oracle 查询库中所有表名、字段名、字段名说明,查询表的数据条数、表名、中文表名、
查询所有表名:select t.table_name from user_tables t;查询所有字段名:select t.column_name from user_col_comments t; ...
- Oracle生成查询包括对应于所有数据表记录语句中指定的字段名
应用:已知的字段名,表中的所有数据的查询数据库中包含的所有数据表的字段名 操作方法:指定字段名,用户数据库表,它可以执行以下查询 --Oracle生成查询包括对应于所有数据表记录语句中指定的字段名 d ...
- Oracle生成查询包含指定字段名对应的所有数据表记录语句
应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 de ...
- MYSQL根据字段名查询所属表
MYSQL里面需要根据某个字段名,查询该字段名所在的表.这种情况主要是出现在比如你忘了表名,只知道有这样一个字段名,想找出那张表.第二种情况可能是,同一个字段名属于外键,你想找出例如 ID 这个字段 ...
随机推荐
- Centos6.8防火墙配置
1.基本操作 # 查看防火墙状态 service iptables status # 停止防火墙 service iptables stop # 启动防火墙 service iptables star ...
- 当你的电脑出现stop: 0X0000007B
这几天可算是把我折腾惨了.先是linux系统无法进入图形化桌面,几经折腾,我把linux删除重装.怎知道,我在瘟都死下删除linux的分区,结果我的两个瘟都死分区也没了,哭了我去恢复数据,但是然并卵. ...
- 未能解析此远程名称: 'www.***.com' 解决办法
今天发布网站的时候在本机IIS上调试完全没问题,但发布到远程服务器上却出现了如下错误: 原因:远程服务器的DNS解析失败,不能对类似于'www.***.com' 的网站解析,所以我们要进行手动解析. ...
- python pandas stack和unstack函数
在用pandas进行数据重排时,经常用到stack和unstack两个函数.stack的意思是堆叠,堆积,unstack即"不要堆叠",我对两个函数是这样理解和区分的. 常见的数据 ...
- angular4.0使用JSONP数据请求
ng4中有很多获取数据的API,为了满足跨域的需求,我选择JSONP模块: 应该有很多小伙伴遇到这个报错吧 injected script did not invoke callback: 下面我写个 ...
- mysql如何执行关联查询与优化
mysql如何执行关联查询与优化 一.前言 在数据库中执行查询(select)在我们工作中是非常常见的,工作中离不开CRUD,在执行查询(select)时,多表关联也非常常见,我们用的也比较多,那么m ...
- Oracle重做日志恢复数据模拟实验
一 系统环境: 1.操作系统:oracle Linux 5.6 2.数据库: Oracle 11g 二 Oracle 重做日志的作用: [模拟介质恢复] 1. 关闭数据库归档模式: [oracle@t ...
- [异常解决] 奇巧淫技——VirtualBox中的linux无显示启动,并在win7上远程控制
楼主是资深技术宅(癖),由于感觉手上的老笔记本太卡,遂狠心买了个性能至强的主机同时配了个投影仪(满足躺着打代码的意淫场景).但是体验了大概一个月发现还是坐着打代码舒服,但是如下图坐着打代码总是要抬头看 ...
- 【转载】ipcs与Linux共享内存
一.共享内存相关知识 所谓共享内存,就是多个进程间共同地使用同一段物理内存空间,它是通过将同一段物理内存映射到不同进程的 虚拟空间来实现的.由于映射到不同进程的虚拟空间中,不同进程可以直接使用,不需要 ...
- win10 uwp 横向 AppBarButton
一般看到的 AppBarButton 都是图片在上面,文字在下面,是否可以更改让文字在和图片相同的位置?本文告诉大家如何做出横向的 AppBarButton 把图标和文本放在一起. 如果需要添加 Ap ...