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()
于是 改成如下
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();
thinkphp 5数据库操作的更多相关文章
- ThinkPHP之数据库操作
Model文件位置 ThinkPHP使用的是MVC架构,所以我们我们在操作数据库时,首先需要创建自己的Model类. 在每个模块下有个Model文件夹,我们可以将Model类放置在该文件夹下.如果多个 ...
- ThinkPHP中数据库操作返回值总结
转自:http://www.baiwar.com/post/thinkphp-database-operations-in-the-return-value.html Thinkphp中的Think\ ...
- 【转】ThinkPHP中数据库操作返回值总结
Thinkphp中的Think\Model类提供了数据库的基本CURD(Create.Update.Read及Delete),通过该类可以很便捷的进行操作.Model类及扩展类主要的方法有: Crea ...
- thinkphp对数据库操作有哪些内置函数
getModelName() 获取当前Model的名称 getTableName() 获取当前Model的数据表名称 switchModel(type,vars=array()) 动态切换模型 tab ...
- thinkphp一般数据库操作
引入命名空间 插入 更新 查询 删除 一些支持命令行的操作 清空操作 分库操作 分库相关配置---在config.php中进行 使用: 参数绑定 占位符绑定 第一句后半拉
- thinkphp 对数据库的操作
查看ThinkPHP完全开发手册3.1 首先编辑配置文件 thinkphp这个数据库就不乱改了 昨天新建了一个 confluence(utf8)数据库 所以就用它学习一下吧,因为就只建立了一个数据库, ...
- thinkPHP数据库操作
thinkPHP如果要对数据库操作,一般来说首先要做的是在配置文件中链接数据库,然后用M方法实例化一张表,然后就是对表的操作了 可以开启调试功能查看程序执行的sql语句: 1.开启调试功能(默认是已经 ...
- ThinkPHP 数据库操作(一) : 连接数据库
ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操 作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理.采用 P ...
- 扣出thinkphp数据库操作类
假如你是一位thinkphp的使用者,想必你会觉得thinkphp操作数据库非常方便.现在在你面前有一个非常小的作业,小到完全没有必要用thinkphp去完成它.但是你又觉得不用thinkphp的话, ...
随机推荐
- (转)Linux: dirname、basename命令详解
Linux: dirname.basename命令详解 原文:http://blog.sina.com.cn/s/blog_3f63916f010143vo.html 一.dirname指令 1.功能 ...
- Hadoop TaskScheduler源码分析
TaskScheduler是MapReduce中的任务调度器.在MapReduce中,JobTracker接收JobClient提交的Job,将它们按InputFormat的划分以及其他相关配置,生成 ...
- python学习四(处理数据)
head first python中的一个数据处理的例子 有四个U10选手的600米成绩,请取出每个选手跑的最快的3个时间.以下是四位选手的9次成绩 James 2-34,3:21,2.34,2.45 ...
- Spark最简安装
该环境适合于学习使用的快速Spark环境,采用Apache预编译好的包进行安装.而在实际开发中需要使用针对于个人Hadoop版本进行编译安装,这将在后面进行介绍. Spark预编译安装包下载——Apa ...
- ORA-29875 出现问题解决办法
出现问题:Underlying DBMS error [ORA-29875: 无法执行 ODCIINDEXINSERT 例行程序ORA-20085: Insert Spatial Reference ...
- 介绍一个很好用的Rsa加解密的.Net库 Kalix.ApiCrypto
Rsa非对称加密技术 这个就不说了,大家上网搜索都知道,公钥加密,私钥解密.当然大家也可以自己实现.这里就懒了,就去找一个现成的库,Nuget上搜索,GitHub上搜索,发现.Net的加解密库,下载量 ...
- hibernate课程 初探单表映射3-1 单一主键
本节简介: 1 单一主键的两种赋值方式:手动赋值(assigned)和自动赋值(native) 2 mysql和oracle赋值的不同形式 3 demo 2 native由底层数据库生成标识符,如果是 ...
- Diary
2019.1.16 233333333 2018.12.5 猜猜我写了什么? 2018.12.3 maya真是越来粤菜了.. 突然发现cf其实有中文 2018.12.1 说好的今天出成绩呢?.. 咕咕 ...
- ps使用
1.图片剪裁 1.按快捷键M(矩形选择工具)-> 选中要扣出的图片(按shift可正方形)->按快捷键C(剪裁工具)->双击鼠标选中区域,剪裁成功. 2.选中psd中的图标 1.按快 ...
- HTTPS与SSL(二)
CA Ca介绍 电子商务认证授权机构(CA, Certificate Authority),也称为电子商务认证中心,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系 ...