ThinkPhp开发文档(基础篇)

时间:2024-03-04 17:30:14

ThinkPhp开发文档

查询

案例

	//获取user列表
    public function get_user_list()
    {
        //1.首先获取用户id,用户已有id、邮箱等属性,在Base类中已经进行过邮箱校验,其余类继承Base即可
        $user_id = Session::get(\'user_id\');
        //2.定义列表,运用框架语法查询,注意,卫星系统一共有三个库,frss(主库)、fess_csg(副库)、frss_ific(副库)
        //调用主库案例
        $user_list = Db::table(\'user\') //默认是主库
            ->field(\'id\',\'name\',\'dapartment\') //查询哪些列
            ->where(\'del\',\'=\',\'0\') // 查询条件
            ->where(\'id\',\'<>\',$user_id) //查询条件,条件之间默认为and链接
            ->select(); //定义查询语句
        return json (\'code\'>=0,\'msg\'=>\'查询成功\',date=>$user_list)   //返回以json的格式返回,包括code、msg、data
       //此为副库查询案例  
       /* $data=Db::connect(\'db_cfg\')
            ->table(\'correspondence_template\')
            ->field(\'id,template_name,hanjianleixing,shouhanjigou,jigoudizhi,mubanyuyan,text\')
            ->select();
        return json([\'code\' => 0, \'msg\' => \'查询成功\',\'data\'=>$data]);   
        */ 
    }

注意点

  • 首先获取用户id,用户已有id、邮箱等属性,在Base类中已经进行过邮箱校验,其余类继承Base即可
  • 定义列表,运用框架语法查询,注意,卫星系统一共有三个库,frss(主库)、fess_csg(副库)、frss_ific(副库)
  • 返回以json的格式返回,包括code、msg、data
  • find方法查询结果不存在,返回null,否则返回结果数组
  • select方法查询多条数据

更新

案例

public function update_user()
{
    $share_id=Request::param(\'share_id\');  //Request::param(\'a\') 获取只能获取单个参数,$data = Request::only([\'a\',\'b\'])获取多个参数
    $id=Request::param(\'id\');
    $user_id=Session::get(\'user_id\');
    $data=Db::table(\'correspondence_manage\')
        ->where([
            \'id\'=>$id,
            \'user_id\'=>$user_id,
        ])
        ->update([
            \'share_to_user_id\'=>$share_id
        ]);
        return json([\'code\'=>0,\'msg\'=>\'设置成功\']);
}

注意

  • Request::param(\'a\') 获取只能获取单个参数,$data = Request::only([\'a\',\'b\'])获取多个参数
  • 其他同上

删除

案例

public function del_file(){
    $file_id=Request::param(\'id\');
    $user_id=Session::get(\'user_id\');
    $file_path=Db::table(\'coordination_task_file\')
        ->where([
            [\'id\',\'=\',$file_id],
            [\'user_id\',\'=\',$user_id]
        ])
        ->find();
    if($file_path){
        @unlink($file_path[\'ture_path\']); //当添加到PHP中的表达式时,该表达式可能生成的任何错误消息都将被忽略
        Db::table(\'coordination_task_file\')->delete($file_id);
        return json([\'code\'=>0,\'msg\'=>\'删除成功\']);
    }
    return json([\'code\'=>-1,\'msg\'=>\'删除失败。\']);
}

注意

  • 当添加到PHP中的表达式时,该表达式可能生成的任何错误消息都将被忽略
  • 一般情况下,业务数据不建议真实删除数据,系统提供了软删除机制(模型中使用软删除更为方便)。
// 软删除数据 使用delete_time字段标记删除
Db::name(\'user\')
	->where(\'id\', 1)
	->useSoftDelete(\'delete_time\',time())
    ->delete();

新增

案例

public function new_simulation_info()
{
    $data=Request::only([
        \'simulation_group\',
        \'simulation_name\',
        \'coordination_type\',
    ]);
    $data[\'user_id\']=Session::get(\'user_id\');
    $data[\'add_date\']=date("Y-m-d H:i:s", time());
    $simulation_id=Db::table(\'coordination_task\')->insertGetId($data);
    return json([\'code\'=>0,\'msg\'=>\'添加成功\',\'id\'=>$simulation_id]);
}

注意

  • insert 方法添加数据成功返回添加成功的条数,通常情况返回 1
  • insertGetId 方法添加数据成功返回添加数据的自增主键
$userId = Db::name(\'user\')->insertGetId($data);
  • insertAll方法添加数据成功返回添加成功的条数
$data = [
    [\'foo\' => \'bar\', \'bar\' => \'foo\'],
    [\'foo\' => \'bar1\', \'bar\' => \'foo1\'],
    [\'foo\' => \'bar2\', \'bar\' => \'foo2\']
];
Db::name(\'user\')->insertAll($data);
  • 如果批量插入的数据比较多,可以指定分批插入,使用limit方法指定每次插入的数量限制。
$data = [
    [\'foo\' => \'bar\', \'bar\' => \'foo\'],
    [\'foo\' => \'bar1\', \'bar\' => \'foo1\'],
    [\'foo\' => \'bar2\', \'bar\' => \'foo2\']
    ...
];
// 分批写入 每次最多100条数据
Db::name(\'user\')
    ->limit(100)
    ->insertAll($data);
  • update方法返回影响数据的条数,没修改任何数据返回 0
Db::name(\'user\')    ->where(\'id\', 1)    ->data([\'name\' => \'thinkphp\'])    ->update();
  • 如果update方法和data方法同时传入更新数据,则update方法为准。

查询表达式

表达式 含义 快捷查询方法
= 等于
<> 不等于
> 大于
>= 大于等于
< 小于
<= 小于等于
[NOT] LIKE 模糊查询 whereLike/whereNotLike
[NOT] BETWEEN (不在)区间查询 whereBetween/whereNotBetween
[NOT] IN (不在)IN 查询 whereIn/whereNotIn
[NOT] NULL 查询字段是否(不)是NULL whereNull/whereNotNull
[NOT] EXISTS EXISTS查询 whereExists/whereNotExists
[NOT] REGEXP 正则(不)匹配查询(仅支持Mysql)
[NOT] BETWEEN TIME 时间区间比较 whereBetweenTime
> TIME 大于某个时间 whereTime
< TIME 小于某个时间 whereTime
>= TIME 大于等于某个时间 whereTime
<= TIME 小于等于某个时间 whereTime
EXP 表达式查询,支持SQL语法 whereExp
find in set FIND_IN_SET查询 whereFindInSet

where

案例

Db::table(\'think_user\')    ->where(\'id\',\'>\',1)    ->where(\'name\',\'thinkphp\')    ->select(); 

索引数组

// 传入数组作为查询条件Db::table(\'think_user\')->where([	[\'name\',\'=\',\'thinkphp\'],    [\'status\',\'=\',1]])->select(); 

alias

  • alias用于设置当前数据表的别名,便于使用其他的连贯操作例如join方法等。
Db::table(\'think_user\')->alias(\'a\')->join(\'think_dept b \',\'b.user_id= a.id\')->select();
  • 可以传入数组批量设置数据表以及别名
Db::table(\'think_user\')->alias([\'think_user\'=>\'user\',\'think_dept\'=>\'dept\'])->join(\'think_dept\',\'dept.user_id= user.id\')->select();

field

  • 指定列
Db::table(\'user\')->field(\'id,title,content\')->select();

注意

  • 除了select方法之外,所有的查询方法,包括find等都可以使用field方法。
  • 字段排除,如果我希望获取排除数据表中的content字段(文本字段的值非常耗内存)之外的所有字段值,我们就可以使用field方法的排除功能,例如下面的方式就可以实现所说的功能:
Db::table(\'user\')->withoutField(\'content\')->select();
  • 则表示获取除了content之外的所有字段,要排除更多的字段也可以:
Db::table(\'user\')->withoutField(\'user_id,content\')->select();//或者用Db::table(\'user\')->withoutField([\'user_id\',\'content\'])->select();

limit限制结果数量

  • 例如获取满足要求的10个用户,如下调用即可:
Db::table(\'user\')    ->where(\'status\',1)    ->field(\'id,name\')    ->limit(10)    ->select();
  • limit方法也可以用于写操作,例如更新满足要求的3条数据:
Db::table(\'user\')->where(\'score\',100)->limit(3)->update([\'level\'=>\'A\']);
  • 如果用于insertAll方法的话,则可以分批多次写入,每次最多写入limit方法指定的数量。
Db::table(\'user\')->limit(100)->insertAll($userList);
  • 分页查询
Db::table(\'article\')->limit(10,25)->select();

聚合查询

方法 说明
count 统计数量,参数是要统计的字段名(可选)
max 获取最大值,参数是要统计的字段名(必须)
min 获取最小值,参数是要统计的字段名(必须)
avg 获取平均值,参数是要统计的字段名(必须)
sum 获取总分,参数是要统计的字段名(必须)

query方法原生查询

Db::query("select * from think_user where status=:id", [\'id\' => 1]);
  • 如果你当前采用了分布式数据库,并且设置了读写分离的话,query方法默认是在读服务器执行,而不管你的SQL语句是什么。
  • 使用原生查询有sql注入风险

查询事件

事件 描述
before_select select查询前回调
before_find find查询前回调
after_insert insert操作成功后回调
after_update update操作成功后回调
after_delete delete操作成功后回调

事务

  • 事务四要素原子性、一致性、隔离性、持久性
  • 最简单的方式是使用 transaction方法操作数据库事务,当闭包中的代码发生异常会自动回滚,例如:
Db::transaction(function () {    Db::table(\'think_user\')->find(1);    Db::table(\'think_user\')->delete(1);});
  • 也可手动执行
// 启动事务Db::startTrans();try {    Db::table(\'think_user\')->find(1);    Db::table(\'think_user\')->delete(1);    // 提交事务    Db::commit();} catch (\Exception $e) {    // 回滚事务    Db::rollback();}

一些疑惑

  • var_dump (var,var,bar);

    要注意一点,用var_dump里面的变量必须是存在的,如果变量存在但值是空的就会返回false;没有变量则返回NULL.他自己就有输出的功能。不必加其他的输出函数。

  • 在PHP里面->和=>完全不同的,->用来引用对象的成员(属性与方法),=>只用来数组赋值,下面的例子代码有利于理解:

    $arr``=[``\'a\'``=>123,``\'b\'``=>456];``//数组初始化 ``echo` `$arr``[``\'a\'``];``//数组引用 ``print_r(``$arr``);``//查看数组 ``class` `A{  ``public` `$a``=123;  ``public` `$b``=456; ``} ``$obj``=``new` `A(); ``echo` `$obj``->a;``//对象引用 ``print_r(``$obj``);``//查看对象