模型類的命名以及和數據表的對應關係
在ThinkPHP默認的規則裏面,模型類的命名是有必定的規則的,咱們來舉一些簡單的例子來講明下。
例如,在公司開始開發的時候在數據庫裏面建立了三個表,分別是:think_user、think_group和 think_group_user表。
由於這三個表有着相同的前綴think_,所以咱們在項目配置文件裏面定義數據表的前綴DB_PREFIX爲think_。
爲了對user表和group表進行操做,咱們還須要給這些數據表定義模型,把對數據表的數據存取操做轉換成數據對象的存取操做,若是按照ThinkPHP的慣例,模型類的命名能夠定義以下:
- class UserModel extends Model{}
複製代碼
UserModel對象就對應了數據表think_user的操做,咱們對think_user表的操做就體如今對UserModel對象的操做上面。
例如:
- $User = new UserModel();
- $User->name = 'ThinkPHP';
- $User->email = '[email]liu21st@gmail.com[/email]';
- $User->add();
複製代碼
上面的操做表示把一個用戶數據插入think_user表裏面。
系統根據表前綴定義和UserModel這樣的模型類的命名能夠自動定位到要操做的數據表,而且在ThinkPHP裏面全部的數據表名稱都必須是小寫,因此UserModel和userModel其實並無區別,首字母大寫只是做爲一個命名規範考慮。在ThinkPHP裏面,類名和文件名對應也是一個規則,這樣能夠很方便地使用import導入類庫。
一樣,其餘兩個表就對應了下面的模型類
- class GroupModel extends Model{}
- class Group_UserModel extends Model{}
複製代碼
但是咱們以爲Group_UserModel的命名看得不太舒服(也許有人看的很舒服,呵呵~),因而就想能不能改爲 GroupUserModel這樣的命名呢,答案固然是確定的,並且不難作到。
把類適當修改下,增長一個參數便可。
- class GroupUserModel extends Model{
- protected $tableName = 'group_user';
- }
複製代碼
要注意的是,這裏的tableName並非數據表的全名,真正的表名還要加上定義的前綴。
項目作完了,公司以爲要把全部數據表的前綴修改下,要求改爲top_(公司的形象吧~)
沒有問題,如今咱們只須要修改項目配置文件裏面的數據表的前綴DB_PREFIX定義,而後刪除下項目編譯緩存文件~app.php(注:項目配置文件是包含在項目編譯緩存文件裏面的,而且做爲加載文件的返回值傳給系統),Ok搞定。
如今問題看起來解決了,因而開發好的網站上線了。但是忽然有一天,公司說要增長一個數據表ibm_score,用於和合做網站的接口,而且由於須要和外部接口表名沒法更換(也許是其餘緣由~)
如今,咱們不得不使用另外的方法,其實也很容易解決,增長的模型類定義以下:
- class ScoreModel extends Model{
- protected $trueTableName = 'ibm_score';
- }
複製代碼
trueTableName屬性表示了模型對應的數據表的真名,而不會去理會什麼表前綴了。
看上去如今一切都平靜了,網站無端障的運行了半年,但是公司業績上去了,新來了一個技術總監,定義了一些新的規範,要把網站進行一些重構,其中包括了一項小小的要求,模型類命名裏面的UserModel但願改爲User,這下讓公司的技術人員有點爲難,但是老大發話,誰敢不從呢。
但是這個改動沒有難倒公司的ThinkPHP技術人員,他們靈機一動,修改了一個配置參數就輕鬆搞定了,其效率讓新來的技術總監頗爲滿意。
他只是在項目配置文件裏面增長了下面的參數定義
改完以後,他就按照技術總監的意思把全部的模型類命名和文件名都去掉了後面的Model,例如:
- class User extends Model{}
- class Group extends Model{}
- class GroupUser extends Model{ protected $tableName = 'group_user';}
複製代碼
而程序代碼沒有一行改動,並且他還自豪的告訴技術總監,若是他哪天想在模型類的前面增長一個前綴,他也能夠經過增長
MODEL_CLASS_PREFIX
配置定義來實現。
技術總監拍了拍這位技術人員的頭,讚揚道:很好,很強大~
畫外音:要作到模型類的命名規則的改變而不須要修改程序代碼,固然是要使用內置的D方法,若是你使用了
- import('App.Model.UserModel');
- $User = new UserModel();
複製代碼
這樣的代碼,那麼若是UserModel被改爲上面的User類了,這個代碼就出錯了
而若是使用下面的方式
不管做何改變,依然能夠運行,並且更加簡潔不是麼,呵呵~
歡迎關注本站公眾號,獲取更多信息