具体文档: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');