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,一经查实,立即删除!

相关文章

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

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

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

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

putty, puttycm区别

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

使用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

zabbix查看mysql同步_Zabbix 检测Mysql数据库的主从同步

在高并发网站架构中&#xff0c;MySQL数据库主从同步是不可或缺的&#xff0c;不过经常会发生由于网络原因或者操作错误&#xff0c;MySQL主从经常会出现不同步的情况&#xff0c;那么如何监控MySQL主从同步&#xff0c;也变成检测网站正常运行的重要环节。MySQL同步功能由3个线…

二手手机交易平台使用MYSQL的方法_安卓Android校园淘(二手交易)APP设计与实现(MySQL)...

安卓Android校园淘(二手交易)APP设计与实现(MySQL)(任务书,开题报告,中期检查表,文献综述,外文翻译,毕业论文14000字,程序代码,MySQL数据库)本项目就是一个基于Android平台的校园淘APP设计&#xff0c;采用了Struts技术&#xff0c;JDBC技术和Android的基础技术完成开发。收录了…

ADSL之PPPOE

大家好&#xff01;我是书记&#xff0c;今天我来小谈一下网络中的PPPOE技术。 PPPOE&#xff08;Point to Point Protocol over Ethernet&#xff09;以太网点到点协议&#xff0c;简单的说&#xff0c;是以太网协议和PPP协议结合后所产生的协议&#xff0c;是在PPP协…

LAMP环境下ECShop系统部署

作业环境服务器端&#xff1a;RHEL6.0 IP&#xff1a;10.8.110.8 客户端&#xff1a;Windows 7 IP&#xff1a;10.8.110.28 一、ECShop简介 ECShop是上海商派网络科技有限公司&#xff08;ShopEx&#xff09;旗下——B2C独立网店系统&#xff0c;适合企业及个人快速构建个…

SQL Server代理的阶梯 - 第2级:作业步骤和子系列

作者&#xff1a;Richard Waymire&#xff0c;2017/10/11&#xff08;第一版&#xff1a;2011/02/17&#xff09; 原文链接&#xff1a;http://www.sqlservercentral.com/articles/SQLAgent/JobStepsandSubsystems/72268/ 该系列 本文是“Stairway系列&#xff1a;SQL Server代…

如何快速将文本中的tab更换成逗号(图文详解)

不多说&#xff0c;直接上干货&#xff01; 现有一份数据如下。 下载日志数据并分析 到搜狗实验室下载用户查询日志 1) 介绍 搜索引擎查询日志库设计为包括约1个月(2008年6月)Sogou搜索引擎部分网页查询需求及用户点击情况的网页查询日志数据集合。为进行中文搜索引擎用户行为…

Commit Monitor–svn监控工具

SVN更改通知的工具&#xff0c;在这里分享给大家。 自己负责的模块代码有时被同事修改&#xff0c;但是没有知会&#xff0c;也不容易了解到具体的改动内容&#xff0c;可能造成各种各样的问题。这里推荐一个工具Commit Monitor&#xff0c;可以监控svn仓库的提交记录&#xff…

java如何实现Socket的长连接和短连接

讨论Socket必讨论长连接和短连接 一、长连接和短连接的概念 1、长连接与短连接的概念&#xff1a;前者是整个通讯过程&#xff0c;客户端和服务端只用一个Socket对象&#xff0c;长期保持Socket的连接&#xff1b;后者是每次请求&#xff0c;都新建一个Socket,处理完一个请求就…

疯狂的java 目录_疯狂创客圈 JAVA 高并发 总目录

无编程不创客&#xff0c;疯狂创客圈&#xff0c;一大波编程高手正在交流、学习中!疯狂创客圈&#xff1a; JAVA 高并发 研习社群&#xff0c; QQ群&#xff1a;104131248(已满) 236263776 (请加此群)疯狂创客圈 经典图书 &#xff1a; 《Netty Zookeeper Redis 高并发实战…

也谈云计算

云计算的介绍和讨论不时见诸于报章网端&#xff0c;但是基本上是各说各话&#xff0c;众说纷纭中让大家仍然感觉云里雾里&#xff0c;不见明路。 本文没有涵盖全部的观点&#xff0c;但却希望提供一种思路&#xff0c;大家共同探讨云的建设。云计算是英文Cloud Computing的翻译…

用phpmyadmin更改root密码的方法

首先用root账号登陆phpmyadmin&#xff0c;然后点击左侧进入mysql数据库&#xff0c;在顶部点击“mysql”进入sql输入界面。输入以下命令&#xff1a; update user set passwordpassword(root) where Userroot root为你希望修改的密码&#xff0c;切记不要在数据库中直接手工修…

Android开发 ---多线程操作:Handler对象,消息队列,异步任务下载

效果图&#xff1a; 1、activity_main.xml 描述&#xff1a;定义了六个按钮 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/activity_main&quo…

Lunx运维监控_shark巨菜_基础篇

Lunx运维监控_shark巨菜_基础篇一、监控重要性单单从“监控”两个字来谈&#xff0c;范围之广可以涵盖我们生活的方方面面&#xff0c;我们生活和工作中处处可见视频监控的摄像机&#xff1b;机房中的电压电流监控、干湿计、温度计&#xff1b;值班室的网络监控&#xff0c;网站…

java项目皮肤包_java swing项目皮肤包+使用方法说明

这是java swing项目皮肤包使用方法说明下载&#xff0c;项目可用的皮肤包&#xff0c;总共四个&#xff0c;自己下载总结的&#xff0c;包含使用代码说明。直接在main函数最开始加入说明代码即可使用~~~加入代码后记得处理异常&#xff01;软件介绍java swing项目皮肤包使用方法…

WinXP的EFS加密文件如何解密?

根据网上流传的资料&#xff0c;EFS&#xff08;Encrypting File System&#xff09;EFS加密是基于公钥策略的。在使用EFS加密一个文件或文件夹时&#xff0c;系统首先会生成一个由伪随机数组成的FEK(File Encryption Key&#xff0c;文件加密钥匙)&#xff0c;然后将利用FEK和…