thinkphp v5 模型的增刪改查

模型定義

namespace app\index\model;

use think\Model;

class User extends Model
{
 protected $pk = 'uid';//默認(rèn)主鍵是id顽照,如果不是需要綁定
 protected $table = 'cms_user';//綁定數(shù)據(jù)表
// 設(shè)置當(dāng)前模型的數(shù)據(jù)庫連接(當(dāng)你的數(shù)據(jù)庫鏈接不是配置中鏈接時設(shè)置斟珊。)
    protected $connection = [
        // 數(shù)據(jù)庫類型
        'type'        => 'mysql',
        // 服務(wù)器地址
        'hostname'    => '127.0.0.1',
        // 數(shù)據(jù)庫名
        'database'    => 'thinkphp',
        // 數(shù)據(jù)庫用戶名
        'username'    => 'root',
        // 數(shù)據(jù)庫密碼
        'password'    => '',
        // 數(shù)據(jù)庫編碼默認(rèn)采用utf8
        'charset'     => 'utf8',
        // 數(shù)據(jù)庫表前綴
        'prefix'      => 'think_',
        // 數(shù)據(jù)庫調(diào)試模式
        'debug'       => false,
    ];

}

模型調(diào)用

模型類可以使用靜態(tài)調(diào)用或者實例化調(diào)用兩種方式

  • 在模型中調(diào)用
// 靜態(tài)調(diào)用
$user = User::get(1);//$user = $this->get(3);一樣的效果膛檀,都是調(diào)用本類的方法
$user->name = 'thinkphp';
$user->save();

// 實例化模型
$user = new User;
$user->name= 'thinkphp';
$user->save();

// 使用 Loader 類實例化(單例)==>需要引入locader類,`use think\Loader;`
$user = Loader::model('User');

// 或者使用助手函數(shù)`model`也是單例
$user = model('User');
$user->name= 'thinkphp';
$user->id = 3;
$user->save();
  • 在控制器調(diào)用模型
//引入此model類
use app\index\model\User;//==》如果模型名和控制名一樣的話需要設(shè)置別名吗垮。use app\index\model\User as UserModel;
//在方法中實例化
$user = new User;
//調(diào)用實例方法
$user->user_name= 'thinkphp';
return $user->save();
//當(dāng)然也可以使用loader函數(shù),只需在頭部引入即可`use think\Loader;`

添加數(shù)據(jù)

  • 實例化模型對象后賦值并保存:
$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();

此種方式有個缺陷,就是字段值不能和Model里面的成員屬性(比如class羡宙,具體看think\Model.php)一樣,否則會賦值不上掐隐,版本5.0.10狗热,已提出問題,不知道后期會不會優(yōu)化瑟枫。

  • data
$user = new User;
$user->data([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
$user->save();
  • 直接在實例化的時候傳入數(shù)據(jù)
$user = new User([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
$user->save();
  • 過濾非數(shù)據(jù)表字段的數(shù)據(jù)
$user = new User($_POST);
// 過濾post數(shù)組中的非數(shù)據(jù)表字段數(shù)據(jù)
$user->allowField(true)->save();
  • 指定某些字段寫入
$user = new User($_POST);
// post數(shù)組中只有name和email字段會寫入
$user->allowField(['name','email'])->save();
  • 靜態(tài)方法
    還可以直接靜態(tài)調(diào)用create方法創(chuàng)建并寫入:
$user = User::create([
    'name'  =>  'thinkphp',
    'email' =>  'thinkphp@qq.com'
]);
echo $user->name;
echo $user->email;
echo $user->id; // 獲取自增ID

獲取自增ID

  • 出入數(shù)據(jù)獲取自增id
$user           = new User;
$user->name     = 'thinkphp';
$user->email    = 'thinkphp@qq.com';
$user->save();
// 獲取自增ID
echo $user->id;//這里的id是主鍵斗搞,如果主鍵是user_id,那就是$user->user_id

注意不要在同一個實例里面多次新增數(shù)據(jù)慷妙,如果確實需要多次新增僻焚,因為當(dāng)新增數(shù)據(jù)時,$user里面的字段值都是此條的數(shù)據(jù)膝擂,當(dāng)你再次添加時虑啤,會造成當(dāng)前數(shù)據(jù)部分值被替換,而且還存在主鍵架馋。狞山。。所以那不是新增數(shù)據(jù)叉寂,當(dāng)然系統(tǒng)也會報錯萍启,那么可以用下面的方式:

$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();
  • 添加多條數(shù)據(jù)
$user = new User;
$list = [
    ['name'=>'thinkphp','email'=>'thinkphp@qq.com'],
    ['name'=>'onethink','email'=>'onethink@qq.com']
];
$user->saveAll($list);

saveAll方法新增數(shù)據(jù)返回的是包含新增模型(帶自增ID)的數(shù)據(jù)集(數(shù)組)。

修改數(shù)據(jù)

修改數(shù)據(jù)和新增數(shù)據(jù)差不多一個道理,系統(tǒng)會根據(jù)數(shù)據(jù)或者條件自動識別是新增還是修改

  • 實例化模型后調(diào)用save方法表示新增勘纯;//存在主鍵會報錯局服,當(dāng)批量時可以設(shè)置saveAll的第二個參數(shù)為false
  • 查詢數(shù)據(jù)后調(diào)用save方法表示更新驳遵;//因為查詢后此實例帶有主鍵值
  • save方法傳入更新條件后表示更新淫奔;

批量更新僅能根據(jù)主鍵值進行更新,其它情況請使用foreach遍歷更新堤结。

刪除當(dāng)前模型

  • delete
    delete方法需要查詢再刪除唆迁,如果不查詢想通過主鍵刪除的話需要添加where條件,否則會報‘添加條件’錯誤
$user = User::get(1);
$user->delete();
//或者
$user->where('id',1)->delete();
  • destroy
    destroy不能使用其他連貫操作竞穷,如果使用的話會報method not exist:think\db\Query->destroy錯誤唐责,具體請看destroy和delete函數(shù)的區(qū)別。但是可以在傳遞參數(shù)時設(shè)置條件来庭,同時也支持閉包
User::destroy(1);
// 支持批量刪除多個數(shù)據(jù)
User::destroy('1,2,3');
// 或者
User::destroy([1,2,3]);
//條件:id>:id
User::destroy(['id'=>['>',$id]]);
//閉包
User::destroy(function($query) use($id){
     $query->where('id','>',$id);
});

V5.0.9+版本開始當(dāng)destroy方法傳入空值(包括空字符串和空數(shù)組)的時候不會做任何的數(shù)據(jù)刪除操作妒蔚,但傳入0則是有效的

查詢

  • 獲取單個數(shù)據(jù) get
取出主鍵為1的數(shù)據(jù)
$user = User::get(1);
echo $user->name;

// 使用數(shù)組查詢
$user = User::get(['name' => 'thinkphp']);

// 使用閉包查詢
$user = User::get(function($query){
    $query->where('name', 'thinkphp');
});
echo $user->name;

/在模型中,User::可以$this->;如User::get(1)和$this->get(1)一樣
get方法也是不能使用連貫操作的,而且需要傳遞參數(shù)
如果你是在模型內(nèi)部月弛,請不要使用$this->name的方式來獲取數(shù)據(jù)肴盏,請使用$this->getAttr('name') 替代。因為可能會和model類的成員屬性重復(fù)帽衙。

  • 查詢單個 find
$user = new User();
// 查詢單個數(shù)據(jù)
$user->where('name', 'thinkphp')
    ->find();
  • 獲取多個數(shù)據(jù) all
// 根據(jù)主鍵獲取多個數(shù)據(jù)
$list = User::all('1,2,3');
// 或者使用數(shù)組
$list = User::all([1,2,3]);
foreach($list as $key=>$user){
    echo $user->name;
}
// 使用數(shù)組查詢
$list = User::all(['status'=>1]);
// 使用閉包查詢
$list = User::all(function($query){
    $query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
    echo $user->name;
}

數(shù)組方式和閉包方式的數(shù)據(jù)查詢的區(qū)別在于菜皂,數(shù)組方式只能定義查詢條件,閉包方式可以支持更多的連貫操作厉萝,包括排序恍飘、數(shù)量限制等。

  • 獲取多個數(shù)據(jù) select
$user = new User();
// 查詢數(shù)據(jù)集
$user->where('name', 'thinkphp')
    ->limit(10)
    ->order('id', 'desc')
    ->select();

雖然說返回的結(jié)果集是一個數(shù)組對象谴垫,但是不影響遍歷(也不影響在模板中遍歷)章母,直接像處理3.2一樣處理
$list = User::all(function($query){
$query->where('status', 1)->limit(3)->order('id', 'asc');
});
foreach($list as $key=>$user){
echo $user['id'].':'.$user->name.'<br />';
}

  • 獲取某個字段或者某個列的值
// 獲取某個用戶的積分(返回值:字符串)
User::where('id',10)->value('score');
// 獲取某個列的所有值(返回值:數(shù)組)
User::where('status',1)->column('name');
// 以id為索引)(返回值:數(shù)組)
User::where('status',1)->column('name','id');
User::where('status',1)->column('id,name'); // 同tp3的getField

動態(tài)查詢

// 根據(jù)name字段查詢用戶
$user = User::getByUserName('new1');//
// 根據(jù)email字段查詢用戶
$user = User::getByEmail('thinkphp@qq.com');

默認(rèn)按照數(shù)據(jù)表從上到下的順序查詢第一條復(fù)合的數(shù)據(jù),如果需要排序則添加連貫操作

數(shù)據(jù)分批處理

處理大量數(shù)據(jù)的時候使用

User::chunk(100,function($users){
    foreach($users as $user){
        // 處理user模型對象
    }
});

查詢緩存

get方法和all方法的第三個參數(shù)表示是否使用查詢緩存翩剪,或者設(shè)置緩存標(biāo)識乳怎。

$user = User::get(1,'',true);
$list  = User::all('1,2,3','',true);

由于第二個參數(shù)是關(guān)聯(lián)預(yù)載入定義,V5.0.6+版本開始前弯,可以直接在第二個參數(shù)傳入true表示開啟查詢緩存蚪缀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恕出,隨后出現(xiàn)的幾起案子询枚,更是在濱河造成了極大的恐慌,老刑警劉巖浙巫,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件金蜀,死亡現(xiàn)場離奇詭異刷后,居然都是意外死亡,警方通過查閱死者的電腦和手機渊抄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進店門惠险,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人抒线,你說我怎么就攤上這事≡剑” “怎么了嘶炭?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長逊桦。 經(jīng)常有香客問我眨猎,道長,這世上最難降的妖魔是什么强经? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任睡陪,我火速辦了婚禮,結(jié)果婚禮上匿情,老公的妹妹穿的比我還像新娘兰迫。我一直安慰自己,他們只是感情好炬称,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布汁果。 她就那樣靜靜地躺著,像睡著了一般玲躯。 火紅的嫁衣襯著肌膚如雪据德。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天跷车,我揣著相機與錄音棘利,去河邊找鬼。 笑死朽缴,一個胖子當(dāng)著我的面吹牛善玫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播不铆,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝌焚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了誓斥?” 一聲冷哼從身側(cè)響起只洒,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎劳坑,沒想到半個月后毕谴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年涝开,在試婚紗的時候發(fā)現(xiàn)自己被綠了循帐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡舀武,死狀恐怖拄养,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情银舱,我是刑警寧澤瘪匿,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站寻馏,受9級特大地震影響棋弥,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜诚欠,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一顽染、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧轰绵,春花似錦粉寞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翔悠,卻和暖如春业崖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓄愁。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工双炕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撮抓。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓妇斤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丹拯。 傳聞我的和親對象是個殘疾皇子站超,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容