文章详情

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

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-09-02 19:01

关注

单条查询

使用 静态方法 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

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯