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

转载于:https://www.cnblogs.com/djiz/p/8157301.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/267824.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用CRT调试内存分配堆来找出未释放的内存空间

忘记释放已经分配的内存是一种常见的编程错误&#xff0c;当然我指的是在C编程当中&#xff0c;例如下面的代码里面就存在一个忘记释放内存的编程错误。我个人觉得忘记释放内存的编程错误是不可避免的&#xff0c;毕竟程序员都是人&#xff0c;困了&#xff0c;心情不好了&…

java bean工厂_从零构建轻量级Java Web框架

Bean工厂回顾下前面的知识&#xff0c;通过加载配置文件获取应用基础包名&#xff0c;加载基础包名下所有的类&#xff0c;获取Controller,Service类。到目前为止&#xff0c;我们只是加载了类&#xff0c;但是无法通过获取的类来实例化对象。因此需要一个反射工具&#xff0c;…

生活

爱上旁白&#xff0c;爱上娓娓道来&#xff0c;爱上有故事的声音。无需任何背景音乐&#xff0c;只想细细体验独有的味道转载于:https://www.cnblogs.com/Fsiswo/p/8167756.html

int指令01 - 零基础入门学习汇编语言64

第十三章&#xff1a;int指令01 让编程改变世界 Change the world by program 引言 在第12章中&#xff0c;我们讲解了中断过程和两种内中断的处理。 这一章中&#xff0c;我们讲解另一种重要的内中断&#xff0c;由int指令引发的中断。 万众瞩目&#xff0c;是什么呢&am…

JAVA中常用的逻辑运算符_Java中的常见运算符以及使用

Java中的运算符有算术运算符、关系运算符、逻辑运算符、赋值运算符、字符串连接运算符、三目运算符等。下面介绍一下这几种。1、算术运算符包括&#xff1a;加()、减(-)、乘(*)、除(/)、取余(%)、自加()、自减(--)。<1>使用乘法时&#xff0c;需注意乘积结果是否会出现溢…

【2016计概A期末】照亮房间

你需要放置一盏灯来照亮房间的每个角落&#xff0c;问这是否能办到&#xff1f; 输入包含多组数据。 每组数据第一行是正整数n(4<n<100)&#xff0c;表示房间轮廓所形成的多边形的顶点个数。 接下来n行&#xff0c;每行表示房间的一个顶点。 顶点按顺时针的顺序给出&…

Ext智能提示 - Spket(Eclipse插件)

Eclipse的Ext 2.0.2智能提示.它提供了非常准确的Ext API提示 最近在搞java的项目&#xff0c;哇哇&#xff0c;js如果没有插件的话&#xff0c;那写的真的叫痛苦&#xff0c;所以上网搜搜了&#xff0c;找到了一个插件&#xff0c;还不错&#xff0c;蛮好用的 首先下一个插…

JAVA fileupload怎么用_jquery.fileupload使用例子java

jsp页面信息如下&#xff0c;整个页面信息pageEncoding"utf-8" import"java.io.*"%>String path request.getContextPath();String basePath request.getScheme() "://" request.getServerName() ":" request.getServerPort()…

清高是有代价的

朋友C哥&#xff0c;才高八斗。虽然是记者出身&#xff0c;做过报社社长&#xff0c;但是老刘认为C哥之才&#xff0c;最重要的并非文章学问&#xff0c;而是做事之才、经营之才、管理之才。由报社社长至投资公司总裁&#xff0c;并完成某公司香港上市&#xff0c;被人誉为干了…

Java中常用的测试工具JUnit

使用步骤 1.新建一个test源文件夹&#xff08;SourceFolder&#xff09;&#xff0c;避免和业务代码的src混在一起 2.在test下新建JUnit Test Case 3.相关测试代码放到一个Test Case,每个小的测试代码搞一个测试的方法&#xff0c;方法上标记Test BeforeClass 标注BeforeClass的…

python pyqt eric_科学网—PyQt及Eric的安装 - 张鲁新的博文

PyQt及Eric的安装已有 10440 次阅读2010-4-16 13:19|个人分类:生活点滴|系统分类:科研笔记|Python, Eric, PyQtPython是功能很强大的脚本语言。Qt是跨平台的界面开发语言。二者的结合就是PyQt&#xff0c;而Eric则是由Python开发的一款支持PyQt的IDE。 Python目前有两个较大的版…

sharepoint对象模型性能比较

sharepoint的对象模型的属性和方法有多种&#xff0c;可能对于一些初学者不明白他们之间有什么区别&#xff0c;那种更优越&#xff0c;在何种情况下用那种属性或方法&#xff0c;通过这篇文章你会有所了解 1&#xff0c;splist 有些人喜欢通过列表的名字去获得列表&#xff0c…

package.json---入门说明

直接的说&#xff1a;就是管理你本地安装的npm包 一个package.json文件可以做如下事情&#xff1a; 展示项目所依赖的npm包 允许你指定一个包的版本[范围] 让你建立起稳定&#xff0c;意味着你可以更好的与其他开发者共享 创建package.json 在你要创建的目录下执行&#xff1a;…

java多线程实战指南_学习笔记《Java多线程编程实战指南》二

2.1线程属性属性属性类型及用途只读属性注意事项编号(id)long型,标识不同线程是不适合用作唯一标识名称(name)String型&#xff0c;区分不同线程否设置名称有助于代码调试和问题定位线程类别(daemon)boolean型&#xff0c;true为守护线程&#xff0c;false为用户线程否在start方…

putty, puttycm区别

2019独角兽企业重金招聘Python工程师标准>>> 在windows上实现telnet, ssh等工具有几个方案可以选择, 本文总结了putty putty cm的方案, 并且简短地和 cygwin console2方案做了一下比较. 由于putty的安装 配置比较简单, 本文主要讨论了Putty cm的配置和中文的支持.…

思科网络基础之访问控制列表

loading....转载于:https://www.cnblogs.com/changha0/p/8185866.html

java编写日期_Java常用日期操作

//日期转字符串,根据需要调整格式Testpublic voidDateToString(){Date currentTime newDate();SimpleDateFormat formatter new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateStringformatter.format(currentTime);System.out.println(dateString);}字符串转…

使用jQuery Treeview插件实现树状结构效果

首先到一个国外网站上下载Treeview插件&#xff1a;http://bassistance.de/jquery-plugins/jquery-plugin-treeview/当然你也可以通过我博客的源文件直接下载&#xff1a;http://files.cnblogs.com/jishume/jquery_api_for_dw4.rar 为了形象一点&#xff0c;先看一个效果图&…

冲刺二周04

第四天&#xff1a; 昨天干什么&#xff1a;完成搜索界面 今天干什么&#xff1a;编写模糊查询搜索的代码 遇见什么问题&#xff1a;不熟悉 团队成员会议照&#xff1a; 转载于:https://www.cnblogs.com/ghl0518/p/8301051.html

[转]The Top 10 Attributes of a Great Programmer

With all the latest attention again on what does and doesn’t make a good programmer, I couldn’t help but put together my own top 10 list. Being a great problem solver.Being driven and lazy at the same time.Ability to understand other people’s codeHaving…