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

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

单条查询

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

静态方法 get

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

User::get(1);

返回值

返回模型类的实例

举例

获取主键为1的用户

$user = User::get(1);
echo ("<pre>");
var_dump($user);
echo ("</pre>");

如果主键为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 ("<pre>");
var_dump($result);
echo ("</pre>");

如果主键为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 ("<pre>");
var_dump($userArr);
echo ("</pre>");

不管主键对应的数据存在或者不存在,都会返回一个 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 ("<pre>");
var_dump($userArr);
echo ("</pre>");

不管主键对应的数据存在或者不存在,都会返回一个 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 的原理如下

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

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

返回值

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

参数

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

重要提醒

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

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

$obj 没有任何改变

                       

点击阅读全文

上一篇 2023年 6月 7日 am10:36
下一篇 2023年 6月 7日 am10:38