登录  /  注册
博主信息
博文 91
粉丝 2
评论 4
访问量 125298
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
tp5模型的运用
夏日的烈风的博客
原创
2795人浏览过

    http://www.php.cn/php/php-sava.html


1,。

获取单条:get静态方法


获取表中单条记录:get方法

这个方法的重点是参数设置

1. 功能:返回数据表中满足条件的一条记录

提醒:即使返回多条记录,也仅返回满足条件的第一条记录

2. 源码:

/**
     * 查找单条记录
     * @access public
     * @param mixed        $data  主键值或者查询条件(闭包)
     * @param array|string $with  关联预查询
     * @param bool         $cache 是否缓存
     * @return static
     * @throws exception\DbException
     */public static function get($data = null, $with = [], $cache = false){$query = static::parseQuery($data, $with, $cache);return $query->find($data);
    }

可以看出内部仍是使用Query查询方法来解决,当然这里返回的是对象,不是数组。

3. 参数与返回值:

参数:

序号

参数

说明

1    数字/字符串    主键    

2    查询表达式    支持所有查询表达式    

3    闭包函数    支持更多高级查询语法    

返回值:数据对象。

4. 实例演示: 读取tp5_staff表中id=1020的记录

表中数据如下:

一、主键查询:数字/字符串

控制器:Index.php

<?phpnamespace app\index\controller;//导入模型类use app\index\model\Staff;class Index {  public function index(){ 

      //1.获取表中单条记录  $result = Staff::get(1009) //静态调用get方法,主键查询  -> getData();    //获取数据对象中原始数据  //2.查询原始数据  dump($result);   
  }
}

查询主键也可以写在字符串中,与直接写数字是等效的

      $result = Staff::get('1009') //静态调用get方法,主键查询  -> getData();        //获取数据对象中原始数据

二、表达式查询

控制器:Index.php

<?phpnamespace app\index\controller;//导入模型类use app\index\model\Staff;class Index {  public function index(){ 

      //1.获取表中单条记录      $result = Staff::get(['id'=>1009]) //静态调用get方法  -> getData();    //获取数据对象中原始数据  //2.查询原始数据  dump($result);   
  }
}

查询条件可以单独给出,不直接写在参数中:

第一种:

$map['id'] = 1009;       //查询条件用数组方式$result = Staff::get($map) //静态调用get方法  -> getData();    //获取数据对象中原始数据

第二种:

$map['id'] = ['=',1009];  //查询条件用数组表达式$result =  Staff::get($map) //静态调用get方法-> getData();    //获取数据对象中原始数据

以上三种查询方式,查询结果均为:

array(7) {
  ["id"] => int(1009)
  ["name"] => string(9) "老顽童"
  ["sex"] => int(1)
  ["age"] => int(39)
  ["salary"] => float(5000)
  ["dept"] => int(2)
  ["hiredate"] => string(10) "2010-09-13"}

思考:如果我们只想输出id,name,salary字段,其它信息不要,怎么办呢?

三、闭包查询

闭包查询:支持更多的过滤条件,提供更加高级的查询

现在我们解决一下上面提出的问题,选择部分字段输出

<?phpnamespace app\index\controller;//导入模型类use app\index\model\Staff;class Index {  public function index(){ 

      //1.定义闭包函数  $closure = function ($query){$query -> field('id,name,salary')  //设置查询字段   -> where('id = 1009');      //设置查询主键  };      //2.执行查询,并获取原始数据  $result = Staff::get($closure) //静态调用get方法  -> getData();          //获取数据对象中原始数据  //3.查询原始数据  dump($result);   
  }
}

查询结果如下(仅输出指定字段信息):

//上例输出7个字段,本例仅输出3个字段array(3) {
  ["id"] => int(1009)
  ["name"] => string(9) "老顽童"
  ["salary"] => float(5000)
}

5. 总结:

用get( )方法查询时,推荐使用闭包,这样可以更加灵活的定制查询结果。

获取单条:对象查询


Model对象查询单条记录

创建模型对象,获取数据表中一条记录是非常简单的操作

1. 功能:用对象方式实现对数据表一条记录的查询

实现原理:我们在后面的:对象方式获取多条记录时再详细讲解

2.  实现原理:通过调用Model类__call( )魔术方法实现与数据库查询对接

public function __call($method, $args){    //获取查询对象$query = $this->db();   if (method_exists($this, 'scope' . $method)) {// 动态调用命名范围$method = 'scope' . $method;
            array_unshift($args, $query);
            call_user_func_array([$this, $method], $args);return $this;
        } else {return call_user_func_array([$query, $method], $args);
        }
    }

源码分析:

当对象调用类中不存在的方法时,__call( )方法自动触发;

$query = $this->db();,获取数据库查询对象,便于调用连贯方法;

call_user_func_array([$query, $method], $args);动态调用方法。

3. 基本语法格式:

//1.创建模型对象模型对象 = new  自定义模型类(Model类的子类);//2.调用数据库查询方法数据集 = 模型对象 -> 连贯方法(参数) -> 终极方法() ;

举例:

//1.创建模型对象$model = new Staff();//2.调用数据库查询方法$result = $model -> where('id',1010) -> find() ;

4. 实例演示

任务1:查询tp5_staff表中,id编号等于1009的员工信息:编号、姓名、年龄、工资;

创建Staff模型类:/application/index/mode/Staff.php

<?php
namespace app\index\model;//导入模型类use think\model;class Staff extends model {//自定义模型类代码}

控制器:/application/index/controller/Index.php

<?phpnamespace app\index\controller;//导入模型类use app\index\model\Staff;class Index {  public function index(){//设置字段别名$field['id'] = '编号';$field['name'] = '姓名';$field['age'] = '年龄';$field['salary'] = '工资';//设置查询表达式$map['id'] = 1009;//1.创建模型对象$model = new Staff();//2.执行查询,返回数据对象数组$result = $model -> field($field)  //限制显示字段 -> where($map)    //过滤查询结果  -> find();      //获取结果集   //getData()可以获取数据对象原始数据:$data属性值dump($result -> getData());
    }  
  }

查询结果如下:

array(4) {
  ["编号"] => int(1009)
  ["姓名"] => string(9) "老顽童"
  ["年龄"] => int(39)
  ["工资"] => float(5000)
}

生成的SQL语句:

SELECT `id` AS `编号`,`name` AS `姓名`,`age` AS `年龄`,`salary` AS `工资` FROM `tp5_staff` WHERE `id` = 1009 LIMIT 1

SQL尾部自动加上LIMIT 1,确保仅输出一条记录

在SQLPRO for MySQL中执行:

5. 总结

采用模型对象查询记录非常方便! 但是效率不如静态方法~~


本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!
全部评论 文明上网理性发言,请遵守新闻评论服务协议
0条评论
作者最新博文
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号

  • 登录PHP中文网,和优秀的人一起学习!
    全站2000+教程免费学