Blogger Information
Blog 91
fans 2
comment 4
visits 127877
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
tp5模型的运用
夏日的烈风的博客
Original
2835 people have browsed it

    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. 总结

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


Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post