单条查询 使用 静态方法 get 或者 动态方法 find 静态方法 get 直接使用模型类静态调用,例如 User 模型类获取主键为1的用户 User::get(1); 返回值 返回模型类的实例 举例 获取主键为1的用户 $us
使用 静态方法 get 或者 动态方法 find
直接使用模型类静态调用,例如 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)
需实例化模型类调用,例如 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
直接使用模型类静态调用,例如 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 类实例是一样的。
一种是参数直接填主键数字(前面的实例已经详细讲过)
$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)
该方法需实例化模型类动态调用,例如 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
--结束END--
本文标题: TP5 模型查询的返回值、返回值的判断以及所使用的SQL
本文链接: https://lsjlt.com/news/391280.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0