0
点赞
收藏
分享

微信扫一扫

TP6学习笔记

Separes 2023-07-14 阅读 29


具体文档:https://www.kancloud.cn/dengyulin/think/58288

进行原生的SQL查询 $Model->query('SELECT * FROM think_user WHERE status = 1');

如果你当前采用了分布式数据库,并且设置了读写分离的话,query方法始终是在读服务器执行,因此query方法对应的都是读操作,而不管你的SQL语句是什么

 `$Model = new Model() // 实例化一个model对象 没有对应任何数据表 $Model->execute("update think_user set name='thinkPHP' where status=1");`如果你当前采用了分布式数据库,并且设置了读写分离的话,execute方法始终是在写服务器执行,因此execute方法对应的都是写操作

子查询

新版新增了子查询支持,有两种使用方式:
1、使用select方法
当select方法的参数为false的时候,表示不进行查询只是返回构建SQL,例如: // 首先构造子查询SQL  $subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('status')->select(false);2、使用buildSql方法$subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('status')->buildSql();调用buildSql方法后不会进行实际的查询操作,而只是生成该次查询的SQL语句(为了避免混淆,会在SQL两边加上括号),然后我们直接在后续的查询中直接调用。// 利用子查询进行查询  $model->table($subQuery.' a')->where()->order()->select()构造的子查询SQL可用于TP的连贯操作方法,例如table where等。

多表查询

Subscribe外链Order表,在Subscribe这个模型中增加
public function orders()
{
        return $this->belongsTo('app\common\model\Order', 'subscribe_id', 'subscribe_id');
}

控制器中使用

$list = $this->model->where($where)->field('subscribe_id as id,see_num,consignee,sex')
                ->withJoin([
                    'orders' => ['order_amount', 'pay_status','deliver_status']
                ], 'LEFT')
                ->page($page, $limit)
                ->select();

得到某条记录的单个字段值

$this->model->field('id')->where($where)->value('id')

条件更新:

$save = $this->model->whereIn('subscribe_id',$ids)->update($updateData);
$save = $this->model->update($post, ['time_id' => $id]);
UserAddress::edit($addressInfo, $id, 'id')
$res = $this->model->where('config_name',"DoctorVisit")->save(array("value"=>$json));
//新增记录
UserAddress::create($addressInfo);//新增后可获取整条记录
$this->model-save($addressInfo);//新增后可得到新增是否成功
按条件删除
$this->model = new DoctorTime();   
        $row = $this->model->whereIn('id', $id)->select();
        $row->isEmpty() && $this->error('数据不存在');
        try {
            $save = $row->delete();
        } catch (\Exception $e) {
            $this->error('删除失败');
        }

with使用

1.withjoin是一种方法  

static function getVisitResult()
     {
         $result = self::withjoin('userItems','LEFT')
             ->where('userItems.id','=',1)
             ->order('id desc')
             ->select()->toArray();
  
         return $result;
     }


2.with 闭包

static function getVisitResult()
     {
         $result = self::with(['userItems' => function($query){
             $query->where('id',1);
         }])
             ->with('companyItems')
             ->order('id desc')
             ->select()->toArray();
  
         return $result;
     }

字符串模式查询(采用_string 作为查询条件)
数组条件还可以和字符串条件混合使用,例如:$User = M("User"); // 实例化User对象 $map['id'] = array('neq',1); $map['name'] = 'ok'; $map['_string'] = 'status=1 AND score>10'; $User->where($map)->select();最后得到的查询条件就成了:
id != 1 ) AND ( name = 'ok' ) AND ( status=1 AND score>10 )

请求字符串查询方式
请求字符串查询是一种类似于URL传参的方式,可以支持简单的条件相等判断。$map['id'] = array('gt','100'); $map['_query'] = 'status=1&score=100&_logic=or';得到的查询条件是:id>100 AND (status = '1' OR score = '100')

复合查询
复合查询相当于封装了一个新的查询条件,然后并入原来的查询条件之中,所以可以完成比较复杂的查询条件组装。
例如: $where['name']  = array('like', '%thinkphp%'); $where['title']  = array('like','%thinkphp%'); $where['_logic'] = 'or'; $map['_complex'] = $where; $map['id']  = array('gt',1);查询条件是
(id>1)AND( (namelike'%thinkphp%')OR(titlelike'%thinkphp%') )
复合查询使用了_complex作为子查询条件来定义,配合之前的查询方式,可以非常灵活的制定更加复杂的查询条件。
很多查询方式可以相互转换,例如上面的查询条件可以改成:$where['id'] = array('gt',1); $where['_string'] = ' (name like "%thinkphp%")  OR ( title like "%thinkphp") ';最后生成的SQL语句是一致的。

区间查询

$where[] = array('start_time','between',$today_start,$today_end);
        $where['end_time']=array('ELT',$today_end);
        $doctor_time = new DoctorTime();
        $time_info = $doctor_time->whereBetween('start_time',"$today_start,$today_end")->whereBetween('end_time',"$today_start,$today_end")->find();

从thinkphp 5.1.x后vendor的使用方法发生变化,文档又没有详细说明。官方真的太坑了!

在thinkPHP 5.1.X后新版取消了Loader::import方法以及import和vendor助手函数,推荐全面采用命名空间方式的类以及自动加载机制,如果必须使用请直接改为php内置的include或者require语法。

原来的import(“Vendor.Classes.PHPExcel.IOFactory”);或Vendor(‘phpoffice.phpexcel.Classes.PHPExcel.IOFactory’);方法已经不再使用。

请使用下面的方法:

thinkphp6 使用vendor中的第三方库

require_once('/data/www/xxxxxxx/vendor/PHPExcel/PHPExcel.php');

举报

相关推荐

0 条评论