php7.2以上 废除了 each()方法,项目中用到的地方会出现以下报错
The each() function is deprecated. This message will be suppressed on further calls
解决办法。很简单:
while(list($key,$val)=each($array)) {
#code
}
改成:
foreach($array as $key => $val) {
#code
}
原文链接:https://blog.csdn.net/happyzhlb/article/details/125395508
model模型里面不能使用db()函数,与model里面内置的db()函数冲突了。。
【复杂的sql语句(Abiaok)】
========================================================================
$data = M('recharge_coin')
->field('coin_id,recharge_amount,total_amount,title,sku')
->where($where)
#->where('app_name','in',['vfans','vfans1','all'])
->where(['app_name'=>[['eq','vfans'],['eq','all'],'or']]) //Or条件的写法
->order('recharge_amount asc')->limit(10)->order('sort_order asc')
->select();
if(input('debug')=='true'){ echo M()->getLastSql(); }
if (isset($data['audit_order']) && $data['audit_order'] != '') {
if ($data['audit_order'] == 'desc') {
$order = 'v.audit_time desc';
} else {
$order = 'v.audit_time asc';
}
}
$query->where('v.is_delete',0);
$query->join('user u', 'v.user_id=u.user_id', 'LEFT');
$query->order($order);
$result = $query->paginate(20, false, [
'query' => $data
]);
$where['u.mobile'] = ['exp','like "%'.$mobile.'%" or manager_user like "%'.$mobile.'%"'];
等同于:
$query->whereLike('u.mobile|u.manager_user', "%{$mobile}%");
【复杂的sql语句2】
public function hello6()
{
//$result = Db::name('data')->where('id', 4)->find();
// 可以写成 >= <= <> in [4,5,6,7,8] 'between', [5, 8]
$result = Db::name('data')->where('id','between', [1,9])->select();
print_r($result);
//查询某个字段是否为NULL
$result = Db::name('data')
->where('name', 'null')
->select();
print_r($result);
// 使用EXP条件表达式,表示后面是原生的SQL语句表达式
$result = Db::name('data')->where('id','exp', " > 1 and name = '111'")->select();
print_r($result);
//使用多个字段查询:
$result = Db::name('data')
->where('id', '>=', 1)
->where('name', 'like', '%php%')
->select();
print_r($result);
// 或者使用
$result = Db::name('data')
->where([
'id' => ['>=', 1],
'name' => ['like', '%think%'],
])->select();
print_r($result);
// 再来看一些复杂的用法,使用OR和AND混合条件查询
$result = Db::name('data')
->where('name', 'like', '%think%')
->where('id', ['in', [1, 2, 3]], ['>=', 1], 'or')
->limit(2)
->select();
print_r($result);
// 批量查询
$result = Db::name('data')
->where([
'id' => [['in', [1, 2, 3]], ['>=', 1], 'or'],
'name' => ['like', '%php%'],
])
->limit(10)
->select();
print_r($result);
//快捷查询
$result = Db::name('data')
->where('id&status', '>', 0)
->limit(10)
->select();
print_r($result);
$result = Db::name('data')
->where('id|status', '>', 0)
->limit(10)
->select();
print_r($result);
}
【复杂的sql语句3 - 采用闭包方式】
tp5中采用闭包的方式:
$map['user_id']=1;
$map['status']=0;
$or_map['user_id']=$map['user_id'];
$or_map['audit']=['in',['1,2']];
$list = Db::name('table')->where(function ($query) use ($map) {
$query->where($map);
})->whereOr(function ($query) use ($or_map) {
$query->where($or_map);
})->select();
//生成的sql语句:
//SELECT * FROM `tp_table` WHERE ( `user_id` = '1' AND `status` = 0 ) OR ( `user_id` = '1' AND `audit` IN ('1,2') )
【复杂的sql语句4 - 普通方式】
$where = [
'id' => ['eq',5] ,
'status' => [ ['eq',1] , [ 'eq',2 ] , [ 'eq',3 ] , 'or' ] ,
];
$value = DealSpace::where($where)->count();
//最终的查询条件为where feed_uid=5 and (status=1 or status =2 or status =3 )
实测:
$id = Session::get('id');
$where = [
'i.tp_id'=>[['eq',$id],['eq',0],'or'],
'i.status'=>['eq',1]
];
$params = Db::table("ad_img")->alias('i')
->join('user u','i.id=u.id','left')
->field('i.image,u.username,u.id,u.mobile,u.ip')
->where($where)
->select(false);
【输出结果转数组】
$result->toArray();
$result->toItems();
示例:
namespace app\admin\model\report;
use think\Model;
class ReportPeos extends Model
{
protected $table = 'report_peo';
protected $pk = 'id';
protected $field = true;
/** 查询列表
* #$data['begin_time']= $data['end_time'] = '20220823';
*/
public function getList($data){
//按日期搜索,默认今天
$today = date('Y-m-d');
if(isset($data['begin_time']) && isset($data['end_time'])) {
$where['create_date'] = ['between',[$data['begin_time'],$data['end_time']]];
}else{
$where['create_date'] = ['between',[$today,$today]];
}
$where['biz_code'] = 'all';
if(isset($data['biz_code']) && $data['biz_code'] <>'') $where['biz_code'] = $data['biz_code'];
//模型对象
$query = $this->field('*')->where($where);
$order = "create_date desc";
$query->order($order);
$result = $query->paginate(config('page'),false,$config = ['query'=>$data]);
//更改item
$result->each(function($item, $key){
$item['nick_name'] = M('user')->where('user_id',$item['user_id'])->value('nick_name');
});
//累计金额
$total_fee = $this->where($where)->sum('total_fee');
$result->total_fee = $total_fee;
if($result) return $result;
return [];
}
}
【插入数据库必须用model】
----------------------------------------------------------------------------------
$ro_id = model('rechargeOrder')->insert($data); //返回影响数量: 成功1,失败0
$ro_id = model('rechargeOrder')->insert($data,false,true); //返回主键ID, 失败false?
更新数据库:model支持update和save ; 而db只支持update方法
-----------------------------------------------------------------------------------
db('user')->where(array('user_id'=>$user_id))->update(array('is_vip'=>1));
model('user')->where(array('user_id'=>$user_id))->save(array('is_vip'=>1));
model('user')->where(array('user_id'=>$user_id))->allowField(true)->isUpdate(true)->save(array('is_vip'=>1));
【allowField】: 允许更新的字段(true-数据库匹配的字段)
【isUpdate】: true-更新;false-新增;
【获取数据表最后主键ID】
-----------------------------------------------------------------------------------
$ro_id = Db::name('rechargeOrder')->getLastInsID();
Create方法直接插入数据(生成最新主键ID): (TP3只做验证,不插入数据)
-----------------------------------------------------------------------------------
$id = $withdraw_mod->create($data)->getLastInsID()
【打印sql语句的几种方法】
-----------------------------------------------------------------------------------
1. Db::table('')->getLastSql(); 上次执行的sql语句
2. Db::table('user')->fetchSql()->find(); 即将执行的sql语句
不能直接打印这个,会出错(要加 ->find() 或 ->select()):
echo $query->fetchSql(); 错误: Object of class think\db\Query could not be converted to string
3. $res = Db::table('user')->where('id','>',1)->select(false);
halt($res);
4. $res = Db::table('user')->where('id','>',1)->buildSql();
halt($res);
【兼容TP3的 M()方法】
-----------------------------------------------------------------------------------
function M($table=''){
return \think\Db::table($table);
}
【 Thinkphp5 mysql 返回string类型_解决mysql返回的字段值全变成string型的问题】
--------------------------------------------------------------------------------------------------------------------
//兼容老的API /thinkphp/library/think/db/Connection.php 第120行打开了这个转字符串参数:PDO::ATTR_STRINGIFY_FETCHES => true,
参考文档: https://blog.csdn.net/weixin_42681774/article/details/113261916
【thinkPHP5.0.5升级到5.0.24的升级需要注意的问题】
========================================================================
ifnull
select IFNULL(user_name,user_tel) as user_name from user;(5.0.5)
但是,升级后 不能使用IFNULL 了,可以两个字段都查出来后,自行判断
exp
升级之前:
$where['字段 '] = ['exp','表达式']
升级之后
$where['字段'] =Db::raw("表达式")
order
V5.0.17+版本开始,当你的order排序中使用了SQL函数的时候,请使用orderRaw方法替代order,例如:
Db::table('think_user')->where('status=1')->orderRaw('rand()')->limit(5)->select()
I() -> input()
M() -> model() (必须先创建model?)
add() -> insert()
save() -> update()
getField() -> value()
助手函数
5.0助手函数和3.2版本的单字母函数对比如下:
3.2版本 -> 5.0版本
C config
E exception
G debug
L lang
T 废除
I input
N 废除
D model
M db
A controller
R action
B 废除
U url
W widget
S cache
F 废除