我的编程空间,编程开发者的网络收藏夹
学习永远不晚

TP5 模型查询的返回值、返回值的判断以及所使用的SQL

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

TP5 模型查询的返回值、返回值的判断以及所使用的SQL

单条查询

使用 静态方法 get  或者 动态方法 find 

静态方法 get

直接使用模型类静态调用,例如 User 模型类获取主键为1的用户

User::get(1);

返回值

返回模型类的实例

举例

获取主键为1的用户

$user = User::get(1);echo ("
");var_dump($user);echo ("
");

如果主键为1的用户存在,则返回的是主键为1的用户的 User 类实例,该用户的数据保存在User 类实例的 data 属性里,如下

object(app\index\model\User)#49 (2) {  ["data"]=>  array(9) {    ["id"]=>    int(1)    ["username"]=>    string(3) "aaa"    ["password"]=>    string(32) "47bce5c74f589f4867dbd57e9ca9f808"    ["email"]=>    NULL    ["mobile"]=>    NULL    ["level"]=>    int(0)    ["status"]=>    int(1)    ["create_time"]=>    int(1667095117)    ["update_time"]=>    int(1667095117)  }  ["relation"]=>  array(0) {  }}

如果主键为1的用户不存在,则返回 NULL,如下

NULL

get 方法的参数支持具体的查询条件,例如 User 模型类获取 username 字段为 a 的用户资料

User::get(['username'=>'a']);

生成的 SQL 如下

SELECT * FROM `user` WHERE `username` = 'a' LIMIT 1

判断

判断查询的记录是否存在,用 === null 或者  is_null()

$user = User::get(111); //获取一个不存在的用户dump($user === null); //返回 bool(true)dump(is_null($user)); //返回 bool(true)$user = User::get(1); //获取一个存在的用户dump($user === null); //返回 bool(false)dump(is_null($user)); //返回 bool(false)

动态方法 find 

需实例化模型类调用,例如 User 对象获取主键为1的用户。

//手动实例化对象$user = new User();$user->find(1);//或者用模型类的静态方法 where 返回模型类的实例再调用 find 方法User::where(['id'=>1])->find();

返回值

返回模型类的实例

举例

获取主键为1的用户

$user = new User();$result = $user->find(1);echo ("
");var_dump($result);echo ("
");

如果主键为1的用户存在,则返回的是主键为1的用户的 User 类实例,该用户的数据保存在User 类实例的 data 属性里,如下

object(app\index\model\User)#49 (2) {  ["data"]=>  array(9) {    ["id"]=>    int(1)    ["username"]=>    string(3) "aaa"    ["password"]=>    string(32) "47bce5c74f589f4867dbd57e9ca9f808"    ["email"]=>    NULL    ["mobile"]=>    NULL    ["level"]=>    int(0)    ["status"]=>    int(1)    ["create_time"]=>    int(1667095117)    ["update_time"]=>    int(1667095117)  }  ["relation"]=>  array(0) {  }}

如果主键为1的用户不存在,则返回 NULL,如下

NULL

find 方法的参数与 get 方法不同,find 方法不支持具体的查询条件,测试如下

$user = new User();$user->find(['username'=>'a']);

生成的 SQL 如下

 SELECT * FROM `user` WHERE `id` = a LIMIT 1 

显然,这个 SQL 是错误的,如果需要查询条件,在 find 方法前面调用静态方法 where,如下

User::where(['username'=>'a'])->find();

生成的 SQL 如下

 SELECT * FROM `user` WHERE `username` = 'a' LIMIT 1

正确

判断

判断查询的记录是否存在,用 === null 或者  is_null()

$user = User::where(['id'=> 111])->find(); //获取一个不存在的用户dump($user === null); //返回 bool(true)dump(is_null($user)); //返回 bool(true)$user = User::where(['id'=> 1])->find(); //获取一个存在的用户dump($user === null); //返回 bool(false)dump(is_null($user)); //返回 bool(false)

单条查询总结

查询原理

静态方法 get 和动态方法 find 的原理都是使用了 LIMIT 1,SQL 如下

SELECT * FROM `user` WHERE `id` = 1 LIMIT 1

返回值

静态方法 get 和动态方法 find 返回的都是模型类的实例,所以该实例可以使用模型类里面的方法。

参数

静态方法 get 支持具体的查询条件,动态方法 find 只支持主键查询,如果 find 方法需要非主键查询条件,需要在 find 方法 前面调用 where 方法,

多条查询

使用静态方法 all 或者 动态方法 select

静态方法 all

直接使用模型类静态调用,例如 User 模型类获取主键为1、2、3的用户。

参数使用字符串形式$userArr = User::all('1,2,3');或者参数使用数组形式$userArr = User::all([1,2,3]);

返回值

举例

获取主键为1、2、3的用户

$userArr = User::all('1,2,3');echo ("
");var_dump($userArr);echo ("
");

不管主键对应的数据存在或者不存在,都会返回一个 Collection 类的实例,如下

object(think\model\Collection)#49 (1) {  ["items":protected]=>  array(0) {  }}

查询到的数据会保存在该实例的 items 属性里,items 属性是一个数组,因为当前所有主键对应的数据都不存在,所以 items 属性是一个空数组。

当主键对应的数据存在时,Collection 类的实例如下

object(think\model\Collection)#52 (1) {  ["items":protected]=>  array(2) {    [0]=>    object(app\index\model\User)#49 (2) {      ["data"]=>      array(9) {        ["id"]=>        int(1)        ["username"]=>        string(3) "aaa"        ["password"]=>        string(32) "47bce5c74f589f4867dbd57e9ca9f808"        ["email"]=>        NULL        ["mobile"]=>        NULL        ["level"]=>        int(0)        ["status"]=>        int(1)        ["create_time"]=>        int(1667095117)        ["update_time"]=>        int(1667095117)      }      ["relation"]=>      array(0) {      }    }    [1]=>    object(app\index\model\User)#51 (2) {      ["data"]=>      array(9) {        ["id"]=>        int(3)        ["username"]=>        string(8) "aaaaa啊"        ["password"]=>        string(32) "594f803b380a41396ed63dca39503542"        ["email"]=>        string(10) "123@qq.com"        ["mobile"]=>        int(0)        ["level"]=>        int(0)        ["status"]=>        int(1)        ["create_time"]=>        int(1664418328)        ["update_time"]=>        int(1665902120)      }      ["relation"]=>      array(0) {      }    }  }}

因为当前数据库里有 id = 1 和 id = 2 的两条记录,所以 items 属性(数组)里有两个值,每个值都是一个 User 类的实例,这个 User 类的实例和用单条查询的 get 方法或 find 方法得到的 User 类实例是一样的。

all 方法的参数支持两种形式

一种是参数直接填主键数字(前面的实例已经详细讲过)

$userArr = User::all('1,2,3');

这时用的 SQL 如下

SELECT * FROM `user` WHERE `id` IN (1,2,3)

用的是 IN 查询 。

另外一种是参数填具体的查询条件,如下

 $userArr = User::all(['status' => 1]);

这时用的 SQL 如下

SELECT * FROM `user` WHERE `status` = 1

用的是常规查询。

判断

因为 all 方法不管主键对应的数据存在或者不存在,都会返回一个 Collection 类的实例,所以不能用 === null  或者 is_null () 去判断,我们可以用 TP5 模型类内置的 isEmpty 方法进行判断。

$userArr =  User::all('11, 22, 33'); //3个主键 ID 对应的数据都不存在var_dump($userArr->isEmpty()); //返回 bool(true)$userArr =  User::all('1, 22, 33');//当有主键对应的数据存在时(主键1的数据存在)var_dump($userArr->isEmpty()); //返回 bool(false)

  

动态方法 select

该方法需实例化模型类动态调用,例如 User 模型类获取主键为1、2、3的用户。

$user = new User();$userArr =  $user->select([1, 2, 3]);

返回值

举例

获取主键为1、2、3的用户

$user = new User();$userArr =  $user->select('1, 2, 3');echo ("
");var_dump($userArr);echo ("
");

不管主键对应的数据存在或者不存在,都会返回一个 Collection 类的实例(和静态方法 all 一样),如下

object(think\model\Collection)#49 (1) {  ["items":protected]=>  array(0) {  }}

查询到的数据会保存在该实例的 items 属性里,items 属性是一个数组,因为当前所有主键对应的数据都不存在,所以 items 属性是一个空数组。

当主键对应的数据存在时,Collection 类的实例如下(和静态方法 all 返回的 Collection 类的实例一样)

object(think\model\Collection)#52 (1) {  ["items":protected]=>  array(2) {    [0]=>    object(app\index\model\User)#49 (2) {      ["data"]=>      array(9) {        ["id"]=>        int(1)        ["username"]=>        string(3) "aaa"        ["password"]=>        string(32) "47bce5c74f589f4867dbd57e9ca9f808"        ["email"]=>        NULL        ["mobile"]=>        NULL        ["level"]=>        int(0)        ["status"]=>        int(1)        ["create_time"]=>        int(1667095117)        ["update_time"]=>        int(1667095117)      }      ["relation"]=>      array(0) {      }    }    [1]=>    object(app\index\model\User)#51 (2) {      ["data"]=>      array(9) {        ["id"]=>        int(3)        ["username"]=>        string(8) "aaaaa啊"        ["password"]=>        string(32) "594f803b380a41396ed63dca39503542"        ["email"]=>        string(10) "123@qq.com"        ["mobile"]=>        int(0)        ["level"]=>        int(0)        ["status"]=>        int(1)        ["create_time"]=>        int(1664418328)        ["update_time"]=>        int(1665902120)      }      ["relation"]=>      array(0) {      }    }  }}

因为当前数据库里有 id = 1 和 id = 2 的两条记录,所以 items 属性(数组)里有两个值,每个值都是一个 User 类的实例,这个 User 类的实例和用单条查询的 get 方法或 find 方法得到的 User 类实例是一样的。

select 方法的参数与 all 方法有所不同,select 方法参数支持填写多个主键但不支持填具体的查询条件,测试如下

多个主键(前面的实例已经详细讲过)

$user = new User();$userArr =  $user->select('1, 2, 3');

这时用的 SQL 如下

SELECT * FROM `user` WHERE `id` IN (1, 2, 3)

用的是 IN 查询

如果参数填具体的查询条件,如下

$user = new User();$userArr =  $user->select(['status' => '1']);

生成的 SQL 如下

SELECT * FROM `user` WHERE `id` = 1 

显然,这个 SQL 是错误的,如果需要查询条件,在 select 方法前面调用 where 方法,如下

//动态调用$user = new User();$userArr =  $user->where(['status' => 1])->select();//静态调用$userArr = User::where(['status' => 1])->select();

生成的 SQL 如下

SELECT * FROM `user` WHERE `status` = 1

正确

判断

因为 select 和 all 方法一样不管主键对应的数据存在或者不存在,都会返回一个 Collection 类的实例,所以不能用 === null  或者 is_null () 去判断,我们可以用 TP5 模型类内置的 isEmpty 方法进行判断。

$user = new User();$userArr =  $user->select('11, 22, 33'); //3个主键 ID 对应的数据都不存在var_dump($userArr->isEmpty()); //返回 bool(true)$userArr =  $user->select('1, 22, 33'); //当有主键对应的数据存在时(主键1的数据存在)var_dump($userArr->isEmpty()); //返回 bool(false)

多条查询总结

查询原理

静态方法 all 和动态方法 select 的原理如下

用主键作为参数的时候,使用了 IN 查询

有具体的查询条件的时候使用常规查询

返回值

静态方法 all 和动态方法 select 返回的都是 Collection 类的实例,所以该实例可以使用 Collection 类里面的方法。

参数

静态方法 all 支持具体的查询条件,动态方法 select 只支持主键查询,如果 select 方法需要非主键查询条件,需要在 select 方法在前面调用 where 方法,

重要提醒

和模型的动态方法 save 不同,动态方法 find 和 动态方法 select 不会修改调用它的对象的数据,如下

$obj = new User();echo ("
");var_dump($obj);echo ("
");//显示object(app\index\model\User)#43 (2) { ["data"]=> array(0) { } ["relation"]=> array(0) { }}$obj->get(1);echo ("
");var_dump($obj);echo ("
");//显示object(app\index\model\User)#43 (2) { ["data"]=> array(0) { } ["relation"]=> array(0) { }}$obj->select(1);echo ("
");var_dump($obj);echo ("
");//显示object(app\index\model\User)#43 (2) { ["data"]=> array(0) { } ["relation"]=> array(0) { }}

$obj 没有任何改变

来源地址:https://blog.csdn.net/weixin_44161401/article/details/127596407

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

TP5 模型查询的返回值、返回值的判断以及所使用的SQL

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

使用Go语言返回值类型推断构建可扩展的服务

go 语言中的返回值类型推断是一种功能,可让编译器自动推断函数或方法返回值的类型,从而简化代码。通过使用赋值运算符 :=,编译器使用函数上下文信息推断返回值类型。该功能适用于从数据库提取数据并返回 json 响应等场景,但可能不适用于返回特
使用Go语言返回值类型推断构建可扩展的服务
2024-04-30

PHP 中是否可以使用动态类型来定义函数返回值的类型?

尽管 php 是一种动态类型语言,但函数返回值的类型必须是静态的。php 不允许使用动态类型来定义返回值的类型,这有助于在编译时进行类型检查和类型推断,确保程序的健壮性和可靠性。PHP 中使用动态类型定义函数返回值的类型什么是动态类型?
PHP 中是否可以使用动态类型来定义函数返回值的类型?
2024-04-15

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录