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字段名的更多相关文章

  1. 关于 ThinkPHP5 使用 getBy 字段名方式获取数据

    关于 ThinkPHP5 使用 getBy 字段名方式获取数据 有小伙半说怎么全文搜索都没有搜索到 getByName 之类的函数. 其实是在这里.

  2. SQLSERVER 2008 查询数据字段名类型

    SELECT * FROM Master..SysDatabases ORDER BY Name SELECT Name,* FROM Master..SysDatabases where Name= ...

  3. PL/SQL查询,字段名添加中文别名,查询结果的字段名会显示问号,处理方法:

    一开始查询出来的字段名显示的是???,下面说说解决方法(本人也是在网上看到的,算是重复编辑一下): -------------------------------------------------- ...

  4. 查询mysql字段名和字段注释

    select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name='表名' and table_sc ...

  5. ThinkPHP getBy动态查询

    getBy动态查询 ThinkPHP getBy动态查询是一个魔术方法,可以根据某个字段名称动态得到对应的一条数据记录. 根据用户名(username)查询对应的用户资料记录: public func ...

  6. Oracle 查询库中所有表名、字段名、字段名说明,查询表的数据条数、表名、中文表名、

    查询所有表名:select t.table_name from user_tables t;查询所有字段名:select t.column_name from user_col_comments t; ...

  7. Oracle生成查询包括对应于所有数据表记录语句中指定的字段名

    应用:已知的字段名,表中的所有数据的查询数据库中包含的所有数据表的字段名 操作方法:指定字段名,用户数据库表,它可以执行以下查询 --Oracle生成查询包括对应于所有数据表记录语句中指定的字段名 d ...

  8. Oracle生成查询包含指定字段名对应的所有数据表记录语句

    应用场合:已知字段名字,查询数据库中所有数据表中包含该字段名的所有数据表 操作办法:指定字段名,数据库表用户,执行下面查询语句即可 --Oracle生成查询包含指定字段名对应的所有数据表记录语句 de ...

  9. MYSQL根据字段名查询所属表

    MYSQL里面需要根据某个字段名,查询该字段名所在的表.这种情况主要是出现在比如你忘了表名,只知道有这样一个字段名,想找出那张表.第二种情况可能是,同一个字段名属于外键,你想找出例如  ID 这个字段 ...

随机推荐

  1. Xamarin.Forms (Android制作启动画面)

    http://blog.csdn.net/zapzqc/article/details/38496117     Xamarin.Forms 在启动的时候相当慢,必须添加一个启动界面,步骤如下: 1. ...

  2. Web框架django[Form]组件

    新手上路 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 # 创 ...

  3. leetcode — linked-list-cycle

    /** * Source : https://oj.leetcode.com/problems/linked-list-cycle/ * * Given a linked list, determin ...

  4. sed中引用变量

    sed 中引用变量 eval sed 's/string/$REPLACE/g' file awk 中引用变量 awk 在匹配字符串的时候,有时候需要需要引用变量. $pid= eval " ...

  5. Spring异常处理@ExceptionHandler

    最近学习Spring时,认识到Spring异常处理的强大.之前处理工程异常,代码中最常见的就是try-catch-finally,有时一个try,多个catch,覆盖了核心业务逻辑: try{ ... ...

  6. Md2All

    微信公众号:颜家大少欢迎关注我,一起学习,一起进步!目前,知到 Md2All 的朋友还很少,如果你觉得有帮助,希望能告诉身边有需要的朋友. 谢谢! Md2All 简介 一个Markdown在线转换工具 ...

  7. hadoop的安装和配置(三)完全分布式模式

    博主会用三篇文章为大家详细说明hadoop的三种模式: 本地模式 伪分布模式 完全分布模式 完全分布式模式: 前面已经说了本地模式和伪分布模式,这两种在hadoop的应用中并不用于实际,因为几乎没人会 ...

  8. Java学习笔记11---静态成员变量、静态代码块、成员变量及构造方法的初始化或调用顺序

    当创建一个对象时,各种成员变量及构造方法的初始化或调用顺序是怎样的呢? (1).如果类尚未加载,则先初始化静态成员变量和静态代码块,再初始化成员变量,最后调用相应的构造方法: (2).如果类已经加载过 ...

  9. jBPM学习之利用API完成流程实例

    流程引擎对象ProcessEngine是jBPM4所有的Service API之源.在jBPM4中各种服务相互依存,但所有的Service API都从ProcessEngine中获得,由此可见Proc ...

  10. Pyqt4的对话框 -- 文件对话框

    文件对话框允许用户选择文件或文件夹,被选择的文件可进行读或写操作 # QInputDialog 文件对话框 # 本示例包含一个菜单栏,一个状态栏和一个被设置为中心部件的文本编辑器. # 状态栏的状态信 ...