• thinkphp 5数据库操作


    1、原生sql

    $options=Db::table('__MALL_POST__')
    ->alias('m')
    ->join('__MALL_CATEGORY_VALUE__ v','m.id = v.itemid')
    ->join('__MALL_CATEGORY_OPTION__ o','v.oid = o.oid')
    ->where('m.id',$articleId)
    ->select();

    参见 :https://www.kancloud.cn/manual/thinkphp5/118083

    2、输出刚执行的sql语句

    (1)原生sql执行后

    $options=Db::table('__MALL_POST__')
    ->alias('m')
    ->join('__MALL_CATEGORY_VALUE__ v','m.id = v.itemid')
    ->join('__MALL_CATEGORY_OPTION__ o','v.oid = o.oid')
    ->where('m.id',$articleId)
    ->select();

    echo Db::table('__MALL_POST__')->getLastSql();    //测试thimkcmf环境,需要先执行上述sql语句以后才能 getLastSql();  直接Db::table('__MALL_POST__')->getLastSql(); 返回的是上一次执行的sql语句 不是本次操作的。

    (2)有model

    $model= new Model();

    $result=$model->where($where)->select();

    echo $model->getLastSql();

     

    3、多对多关联

          目的:在文章表输出所属分类的自定义参数及参数的值,mall_category_option 表存储了分类的自定义属性主键oid, mall_category_value里存放了文章设置的属相的值(属性id:oid,文章id:itemid)

          model中:

    /**
    * 关联分类属性和属相值表
    */
    public function options(){
          //当前模型通过中间表mall_category_value 与 MallCategoryOptionModel关联
          //第三个参数应该是中间表的字段名,MallCategoryOptionModel的外键
          //第四个参数应该是中间表的字段名,当前模型(mall_post表)的外键
          //这种关联有什么意义????
         return $this->belongsToMany('MallCategoryOptionModel', 'mall_category_value', 'oid', 'itemid');
    }

    Controller:

    $article=$model->where($where)->find();    //根据id读取文章

    $options=$article['options'];//有这句的时候才关联,关联结果不能读取中间表


    foreach($options as $key=>$v){ //返回的是wb_mall_category_option表里通过中间表关联的数据,无法获取中间表数据,如果需要的是中间表数据需要用其他方法
         echo $v['oid'].$v['value']."<BR>";
    }

    显然belongsToMany无法实现目的。

    参考:https://www.kancloud.cn/manual/thinkphp5/142359,我这里无法使用 ->pivot 获取中间表数据,可能是版本原因。

     

    最后用table实现

    $options=Db::table('__MALL_CATEGORY_VALUE__')
    ->alias('v')
    ->join('__MALL_CATEGORY_OPTION__ o','v.oid = o.oid')
    ->where('v.itemid',$articleId)
    ->field('v.value vvalue,name')
    ->select();

     

    4、添加与更新

        

         1、有model

              (1)取出数据并更新

    $user = User::get(1);
    $user->name     = 'thinkphp';
    $user->email    = 'thinkphp@qq.com';
    $user->save();

             (2)直接更新

    $cartModel->save($post,['id' => 1]); //['id' => 1,.....] 是更新条件

    $cartModel->allowField(true)->save($_POST,['id' => 1]); //过滤post数组中的非数据表字段数据
    $user->allowField(['name','email'])->save($_POST, ['id' => 1]); //指定字段

             (2)通过数据库类更新数据

    $user->where('id', 1)->update($post);
    $user->update(['id' => 1, 'name' => 'thinkphp']);

         

      save是model方法,update是数据库类的方法,使用方法不同。

      

     2、原生sql

    $config = Db::getConfig();
    $sql="REPLACE INTO ".$config['prefix']."mall_comment (itemid,mallid,buyer,seller) VALUES ('$oid','$itemid','$userid','$t[user_id]')" ;
    Db::execute($sql);  // 返回影响行数  
    DB::getLastInsID();//返回主键
    
    

    具体参见:thinkphp5数据库操作方法小结:http://www.cnblogs.com/djiz/p/8249956.html

     经测试目前使用版本

    Db::execute 并不支持多个参数
    仅支持,Db::execute($sql,[]) 数组是绑定参数 

    支持
    Db::query('select * from think_user where id=?',[8]);
    Db::execute('insert into think_user (id, name) values (?, ?)',[8,'thinkphp']);
    

    也支持命名占位符绑定,例如:

    Db::query('select * from think_user where id=:id',['id'=>8]);
    Db::execute('insert into think_user (id, name) values (:id, :name)',['id'=>8,'name'=>'thinkphp']);

    要想插入后返回主键 需要使用 $payid=DB::getLastInsID();

    3、新增,在同一实例连续多次新增

    $model->data($post)->save();   //用这个插入比较保险

    $model->data($post)->isUpdate(false)->save();   //多次插入用这个

    原因如下:

    for (i=0;i<3;i++){  //模拟一下新增,实际应用中不可能这么循环

         $model->save($post);  //  第一次 生成的sql 是 insert   ,后边生成的sql是update,应为第一次插入后 有了主键 $model->id;

    }

    查看https://www.kancloud.cn/manual/thinkphp5/135188   给出方案

    注意不要在同一个实例里面多次新增数据,如果确实需要多次新增,那么可以用下面的方式:
    
    $user           = new User;
    $user->name     = 'thinkphp';
    $user->email    = 'thinkphp@qq.com';
    $user->save();
    $user->name     = 'onethink';
    $user->email    = 'onethink@qq.com';
    // 第二次开始必须使用下面的方式新增
    $user->isUpdate(false)->save()
    View Code

    于是 改成如下

    for (i=0;i<3;i++){  //模拟一下新增,实际应用中不可能这么循环

         $model->isUpdate(false)->save($post);  //  这次生成的三个sql都是insert,但是从第二个开始 insert了主键 (报错),还是因为第一次插入就有了主键$model->id;  

    }

    百度后发现 http://www.thinkphp.cn/topic/43590.html   说不能把$post放到save方法里

    于是改成

    $model->data($post)->isUpdate(false)->save();

    解决。

    看来$model->data($post)->save() 和 直接$model->save($post) 是不一样的,用 $model->data($post)->save() 比较保险

    4、where 组合条件

    $model->where("CONCAT(path,'-') like '%-".$vo['id']."-%'")  或者使用闭包

    $queryFun = function($query)use($catid){
       if($catid){
          $query->where('path','like','%-'.$catid.'-%')->whereor('catid',$catid);
       }
    };

    $model->where($queryFun)->select();

  • 相关阅读:
    我喜欢的vs code快捷键for mac
    mssql server for docker on MacOs
    c#面试题汇总(1)
    VS2017的MVC和Angular联合开发的配置文件作用
    联想笔记本装系统
    精彩网页
    WebSocket 是什么原理?为什么可以实现持久连接?
    websocket作用及意义
    C#中静态与非静态方法比较
    Winform数据库连接app.config文件配置
  • 原文地址:https://www.cnblogs.com/djiz/p/8157301.html
Copyright © 2020-2023  润新知