數(shù)據(jù)庫連接器與查詢構(gòu)造器
總結(jié):同之前版本相比,ThinkPHP5的數(shù)據(jù)庫操作對(duì)底層進(jìn)行優(yōu)化設(shè)計(jì)庙洼,對(duì)各種操作進(jìn)行了高級(jí)封裝培己。既可以直接使用連接器進(jìn)行高效的原聲查詢依溯,也可以使用封裝好的查詢構(gòu)造器進(jìn)行直觀便捷的查詢,為模型操作打下了基礎(chǔ)葡粒。
連接數(shù)據(jù)庫
配置方法:
1.靜態(tài)連接:應(yīng)用/模塊中的數(shù)據(jù)庫配置文件database.php
2.動(dòng)態(tài)連接:入口類Db.php中的connect(參數(shù)(數(shù)組和字符串))方法
動(dòng)態(tài)配置連接字符串:mysql://root:1234@localhost:3306/thinkphp#utf8
數(shù)據(jù)庫類型://用戶名:密碼@數(shù)據(jù)庫地址:數(shù)據(jù)庫端口/數(shù)據(jù)庫名#字符集
總結(jié):操作數(shù)據(jù)庫的第一步就是數(shù)據(jù)庫的連接份殿,TP5提供了強(qiáng)大靈活的連接方式,特別是惰性鏈接支持嗽交,極大提高了連接效率(db()助手函數(shù)不支持)卿嘲,使用戶的關(guān)注重點(diǎn)放在業(yè)務(wù)邏輯上,不必?fù)?dān)心連接問題夫壁。
原生SQL查詢
Connection類
1.query(sql語句字符串拾枣,[參數(shù)綁定]):讀操作,select盒让。
2.execute(sql語句字符串梅肤,[參數(shù)綁定]):寫操作,insert邑茄,update凭语,delete。
Connection類實(shí)例通過入口類Db靜態(tài)自動(dòng)調(diào)用撩扒,不用顯示寫出似扔。
參數(shù)綁定:防止SQL注入,用命名占位符進(jìn)行參數(shù)綁定搓谆。
//1.查詢操作:工資大于4000元的員工信息炒辉,用命名占位符進(jìn)行參數(shù)綁定$sql = "select name,salary,dept from staff where salary > :salary";$result = Db:query($sql,['salary'=>4000]);
//2.更新操作,將id=1004的記錄泉手,salary增加1000$sql = "update staff set salary = salary+1000 where id=:id";Db::execute($sql,['id'=>'1004']);
//3.插入操作:默認(rèn)添加到表的尾部的$sql = "insert into staff (name,sex,age) values (:name,:sex,:age)";Db::execute($sql,['name'=>'Alert','sex'=>1,'age'=>33]);
//4.刪除操作:id=1010的記錄$sql = "delete from staff where id=:id";Db::execute($sql,['id'=>1010]);
總結(jié):因?yàn)閿?shù)據(jù)只能識(shí)別并運(yùn)行原生SQL語句黔寇,所以對(duì)于數(shù)據(jù)庫的一切查詢操作,最終都要?dú)w結(jié)到原生查詢斩萌。包括后面要學(xué)到的缝裤,利用查詢構(gòu)造器來進(jìn)行增刪改查操作屏轰,最終仍是調(diào)用連接類Connection對(duì)應(yīng)方法完成。
查詢構(gòu)造器工作原理與鏈?zhǔn)讲僮?/h5>
1.查詢構(gòu)造器的工作原理憋飞?
2.什么是鏈?zhǔn)讲僮黯纾繛槭裁匆面準(zhǔn)讲僮鳎?/p>
3.數(shù)據(jù)表的查詢條件是如何生成的?
table榛做,field唁盏,where
4.如何用查詢構(gòu)造器實(shí)現(xiàn)數(shù)據(jù)表的增刪改查(CURD)操作?
查詢條件生成的三種方法
新增與更新操作
1.新增
insert(['字段'=>'值'])
insert(['二維數(shù)組'])
2.更新
update(['字段'=>'值'])
setInc/setDec('字段',步長)
查詢與刪除操作
1.讀取
find(主鍵)
select(主健)
2.刪除
delete(主鍵)
delete(true)
總結(jié):查詢條件的調(diào)用次序是生成SQL條件的次序检眯,推薦使用閉包厘擂,來生成查詢條件,不僅功能強(qiáng)大锰瘸,而且便于擴(kuò)展刽严。
模型入門知識(shí)
1.什么是模型,有什么用避凝?
模型是對(duì)實(shí)體的抽象描述港庄,快速直觀的展示出實(shí)體的特征。
2.模型類中有哪些屬性和方法
1)模型類的屬性和方法需要在基類Model.php;
2)Model.php類位于public/library/think/Model.php;
3)該類是一個(gè)抽象類恕曲,不能被實(shí)例化鹏氧,必須由子類繼承并實(shí)現(xiàn)內(nèi)部全部抽象方法。
模型的創(chuàng)建與使用方法
1.模型于數(shù)據(jù)表的對(duì)應(yīng)關(guān)系
2.模型與數(shù)據(jù)表的區(qū)別與聯(lián)系
區(qū)別
分工不同:Db類負(fù)則數(shù)據(jù)表的訪問佩谣,模型專注于業(yè)務(wù)邏輯處理
返回值不同:Db訪問返回?cái)?shù)組把还,模型操作返會(huì)對(duì)象
聯(lián)系
模型最終仍需調(diào)用Db類完成數(shù)據(jù)表的查詢操作
3.如何創(chuàng)建模型
1.手工創(chuàng)建:在喲ing用或模塊下創(chuàng)建模型目錄model,并在該目錄下創(chuàng)建與數(shù)據(jù)表同名的類文件:如User.php對(duì)應(yīng)user.dbf表茸俭;
2.命令創(chuàng)建:在當(dāng)前項(xiàng)目目錄下吊履,用命令:php think make:model模塊名/模型名,會(huì)自動(dòng)創(chuàng)建指定位置和命名空的空模型调鬓,并自動(dòng)與數(shù)據(jù)表綁定艇炎;
php think make:model index/student
3.模型創(chuàng)建完成后,會(huì)自動(dòng)獲取當(dāng)前數(shù)據(jù)表名稱$table腾窝,表中所有字段信息$field缀踪,主鍵$pk和數(shù)據(jù)庫配置信息$connection。同時(shí)會(huì)自動(dòng)繼承基類Model中所有屬性和方法虹脯,protected類型在本模型中使用驴娃,public類型還可以在控制器使用,靜態(tài)方法大多直接用在控制器循集,進(jìn)行CURD操作唇敞。
4.如何在控制器調(diào)用模型
1)實(shí)例化調(diào)用:
用new生成模型對(duì)象;
用模型對(duì)象處理相關(guān)業(yè)務(wù);
2)靜態(tài)調(diào)用:
通過靜態(tài)查詢直接將一個(gè)空模型轉(zhuǎn)為數(shù)據(jù)模型疆柔;
再調(diào)用相關(guān)方法完成增刪改查操作咒精;
3)不推薦使用助手函數(shù)model()和添加模型類后綴
5.模型數(shù)據(jù)訪問的方式
模型訪問方式
控制器訪問(外部):用模型對(duì)象:$model;
模型訪問(內(nèi)部):用偽對(duì)象變量:$this;
通過模型和表中添加數(shù)據(jù)
1.什么是CURP操作?
2.Create創(chuàng)建數(shù)據(jù)
1)數(shù)據(jù)創(chuàng)建過程可以觸發(fā)很多操作旷档,非Db操作可比模叙;
2)靜態(tài)調(diào)用的實(shí)質(zhì)其實(shí)仍是實(shí)例化調(diào)用,只是將CURD方法進(jìn)行靜態(tài)封裝彬犯;
3)saveAll()方法實(shí)際上是通過多次執(zhí)行insert語句完成,很少用到查吊;
4)理論上講谐区,通過模型向表中添加數(shù)據(jù),盡可能都采用靜態(tài)方式逻卖。
通過模型更新表中的數(shù)據(jù)
1)不允許無條件更新宋列,必須設(shè)置更新條件;
2)可以將更新條件评也,如主鍵寫在更新數(shù)據(jù)中炼杖,方法可以自動(dòng)識(shí)別;
3)更新條件可以使用閉包盗迟,完成更復(fù)雜的業(yè)務(wù)邏輯坤邪。
通過模型來查詢表中的數(shù)據(jù)
1.ORM模型(對(duì)象關(guān)系映射)
ThinkPHP5實(shí)現(xiàn)了基于ActiveRecords模式的ORM模型
2.Read讀取操作
1)原則來說,查詢都應(yīng)該采用靜態(tài)查詢方法罚缕;
2)盡可能采用get()和all()方法代替find()和select()艇纺;
3)牢記一條原則:一個(gè)模型對(duì)象實(shí)例應(yīng)該唯一對(duì)應(yīng)數(shù)據(jù)表的一條記錄;
通過模型來刪除表中記錄
1)delete()方法不要傳任何參數(shù)邮弹,它只刪除當(dāng)前模型對(duì)象對(duì)應(yīng)的記錄黔衡;
2)destory()中的刪除條件,推薦采用閉包方式腌乡;
3)推薦用軟件刪除替代該方法盟劫,即用更新的方式來實(shí)現(xiàn)刪除操作。
模型讀取器和修改器設(shè)置方法
1.模型的讀取器
觸發(fā)條件:當(dāng)用模型對(duì)象讀取表中字段的時(shí)候与纽;
應(yīng)用場(chǎng)景:日期時(shí)間字段侣签,集合或枚舉數(shù)據(jù),數(shù)字狀態(tài)與文本轉(zhuǎn)換急迂,字段拼裝硝岗;
設(shè)置位置:在模型中設(shè)置,訪問屬性通常為protected袋毙,不允許外部直接訪問型檀;
方法名稱:get屬性名稱Attr($name,$data=[])。
2.模型修改器
觸發(fā)條件:當(dāng)用模型對(duì)象向數(shù)據(jù)表中心增記錄或更新字段值的時(shí)候听盖;
應(yīng)用場(chǎng)景:日期時(shí)間字段胀溺,集合或枚舉數(shù)據(jù)裂七,數(shù)字狀態(tài)與文本轉(zhuǎn)換,字段瓶裝仓坞;
設(shè)置位置:在模型中設(shè)置背零,訪問屬性通常為protected,不允許外部直接訪問无埃;
方法名稱:set屬性名稱Attr($name,$data=[])徙瓶。
修改器的工作原理圖
總結(jié):模型的獲取器與修改器,是模型中最常用的自定義方法嫉称,配合后面要學(xué)習(xí)的驗(yàn)證器侦镇,可以讓用戶更安全的讀取數(shù)據(jù)表中的數(shù)據(jù)。
模型數(shù)據(jù)類型轉(zhuǎn)換屬性
類型轉(zhuǎn)換
總結(jié):通過配置屬性值的方式织阅,來完成寫入數(shù)據(jù)的類型自動(dòng)轉(zhuǎn)換壳繁,比用修改器和讀取器更加靈活方方便。如果數(shù)據(jù)處理邏輯不復(fù)雜荔棉,推薦使用這種方式來替代傳統(tǒng)的讀取器和修改器方法闹炉。
ThinkPHP數(shù)據(jù)庫與模型(原文地址)
結(jié)束。
你們的支持也是我前進(jìn)的動(dòng)力润樱,非常感謝支持渣触!