Tp5笔记初探ThinkPHP5的注意事项(兼容Tp3写法)

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();

示例: 

<?php
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 废除 

猜你喜欢

转载自blog.csdn.net/happyzhlb/article/details/123398061