日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

thinkphp 5数据库操作

發布時間:2023/12/10 php 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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数据库操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。