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
總結
以上是生活随笔為你收集整理的thinkphp 5数据库操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java笔试题及答案
- 下一篇: php-fpm配置笔记