一、CRUD
ThinkPHP提供了靈活和方便的數據庫操作方法,其中最基本的就是CRUD四個操作,只有掌握了最基本的CRUD操作,才能更好的運用更多實用的數據庫操作方法
CRUD操作通常與連貫操作配合
1、創建操作
使用add()方法或addAll()方法
·add()方法
可以直接傳入要插入的數據,而且會在插入之前會過濾掉數據表中不存在的字段以及非法的數據類型(例如對象、數組等非標量數據)。若當前表有主鍵自動增長並且插入記錄成功的話,則返回所插入記錄主鍵值
如果在執行add()操作之前已經創建了數據對象(通過create()方法或data()方法),則add()中可以不傳值
·addAll()方法
addAll()方法可以實現批量插入數據
2、讀取操作
在ThinkPHP中通常分為讀取字段(值,單一值)、讀取記錄(一維數組,單條記錄)和讀取記錄集(二維數組,多條記錄)
·讀取字段(值,單一值)
getField()方法
讀取某一條記錄的某一個字段返回的才是單一值
讀取某一條記錄的多個字段返回的是一個一維關聯數組(鍵為第一個字段值,值為其余字段值)(之所以說其余,是因為其余字段並非只有一個,若其余字段不止一個,則值用一個空格隔開)。ps,如果第一個字段值為數字樣式(不管是int,還是char),形成的是索引數組(雖然在PHP中,索引數組與關聯數組並沒有本質上區別)!
·讀取記錄(一維數組,單條記錄)
find()方法,最多返回一條記錄,即使符合條件的記錄有多條,也僅僅返回一條,所以limit()方法對於find()查詢是無效的
·讀取記錄集(二維數組、多條記錄)
select()方法或findAll()方法
3、更新操作
ThinkPHP主要使用save()方法完成更新操作,還有setField()、setInc()、setDec()方法
·save()方法
對於save()方法,如果沒有where方法()指定更新條件或者數據對象(或者是直接傳入的數組)不包含主鍵字段,則save()方法是不會執行更新操作的。目的是為了保證數據庫的安裝,避免錯誤更新表中的所有記錄!類似於add()方法,如果在調用該方法之前已經創建了數據對象(通過create()或data()方法),則可以不傳值
返回值為受影響的行數,是int類型
·setField()方法
如果只更新某個字段,則也(為什么說也,是因為save()方法也可以更新某一個字段)可以使用setField()方法。當然setField()方法也是可以更新多個字段的,此時傳遞數組參數即可
setField(參數1,參數2); 參數1表示字段名稱,參數2表示將要更新成的值。如果參數1是元素值為各個字段的數組,則參數2也必須是元素值為各個字段相對應值的數組,而且參數1有幾個元素,參數2就必須相應的有幾個元素,這里必須嚴格對應,否則會出現很多意想不到的情況
·setInc()方法
只用於數字類型的字段,setInc(參數1,參數2,參數3); 參數1表示要更新的字段,參數2表示where條件,參數3表示增加的數值(參數3省略則表示增加1)
·setDec()方法
只用於數字類型的字段,setDec(參數1,參數2,參數3); 參數1表示要更新的字段,參數2表示where條件,參數3表示減少的數值(參數3省略則表示減少1)
4、刪除操作
delete()方法,用於刪除記錄,取決於where()方法中定義的條件,同時也可以用order()方法和limit()方法來限制刪除的記錄數
二、連貫操作
ThinkPHP2.0全面啟用連貫操作方法,可以有效提高數據存取的代碼清晰度和開發效率。連貫操作適用於CRUD操作,並不是只使用與R操作
所有的連貫操作都只有一個參數,而且連貫操作的參數只在當前操作中有效,操作完成后自動清空連貫操作的所有傳值。簡而言之,連貫操作的結果不會帶入以后的查詢
舉個例子,查看User表中滿足密碼為123456的前3條記錄,並且按照id進行排序
在連貫操作中,除了select()方法必須放在最后之外,其余方法的順序可隨意。注意,這點與MySQL原生的sql語句要區別開,MySQL原生的sql語句的各子語句是有嚴格的先后順序關系的,所以一下寫法與上面寫法等效!
補充,ThinkPHP不僅僅支持連貫操作,還支持直接使用參數進行查詢,比如說將上述連貫操作的代碼改成如下形式。使用數組參數的方式的話,數組的鍵是連貫操作的方法名,值是連貫操作的參數
1、where()方法
用於查詢、更新、刪除操作中條件的定義,相當於原生sql語句中的where子句
參數支持String、Aarry和Object類型
2、table()方法
用於定義要操作數據表的名稱。也就是說,如果想通過某模型對象操作非該模型對象對應的表或者說操作多張表,則可使用該方法定義想要操作的數據表
注意,表名必須是帶前綴的完整表名,可以使用別名
參數支持String和Array類型(Array類型用於給表起別名,鍵是原名,值是別名。若不指定值,則不起別名) 強調一下,String類型也可以給表起別名的
3、data()方法
用於向模型對象中傳遞數據,然后再進行創建、更新和刪除操作
注意與create()方法區別開,之前探討過兩者之間的區別
4、field()方法
用於查詢操作中所查詢字段的定義
參數支持String和Aarry類型(Array類型用於給字段起別名,鍵是原名,值是別名。若不指定值,則不起別名) 強調一下,String類型也是可以給字段起別名的
5、order()方法
用於結果排序
支持多個字段排序
參數支持String和Array類型(Array類型,鍵是字段名,值是排序規則。若不指定值,則默認是升序)
6、limit()方法
用於結果限制
實際上,對於不同的數據庫,limit子句的語法是不盡相同的,但是ThinkPHP在底層已經為我們屏蔽了這個差異,所以不管是什么類型的數據庫 ,都是使用統一的limit()方法
參數支持String
7、page()方法
用於查詢分頁
page('page,[listRows]'); String類型的參數中,page表示當前為第page頁,listRows表示每頁多少條記錄,如果listRows省略的話,則listRows取limit方法中所限制的記錄條數
注意,一般很少使用該方法,而是使用分頁類
8、group()方法
用於分組
參數只支持String類型
9、having()方法
用於分組后過濾
參數只支持String類型
10、join()方法
用於連接查詢
注意,join()方法是連貫操作中唯一可以多次調用的方法
參數支持String和Array類型
而且在內部已經實現了重復字段的消除處理了的
11、distinct()方法
用於消除重復記錄,即進行唯一性過濾
參數支持Bool類型
12、relation()方法
用於關聯操作
13、lock()方法
用於數據庫中的鎖機制
lock(true)就會自動在生成的sql語句后面加上FOR UPDATE
ps,不難看出,以上這些方法,如果參數是String類型,則該參數就可以按照原生sql相對應的子句語法格式進行書寫!如果參數是Array類型的,則要注意不同方法中,鍵與值的含義