TP5模型不完全解讀

正式介紹ORM之前我們需要了解

第一個原因原生的SQL語句沒有使用查詢構建器等簡潔方便;第二個是主要原因,查詢數據器封裝了對不同數據庫的操作,提供給開發者統一的SQL操作語法,不需要關心原生SQL的差異性
鏈式方法的where方法有三種寫法,表達式、數組法(不建議使用)、閉包法。
開啓SQL日誌信息記錄可以幫助分析寫數據庫查詢語句是否足夠的好,在性能調優以及找錯誤有很大的幫助。生產環境一般不要開啓該SQL日誌記錄

模型

1、複雜的模型可能對應多個對象或者多個數據表的,不是一一對應的,簡單的模型會產生一個假象,即一個模型對應一個數據庫的表,
2、模型的作用主要是用來處理比較複雜的業務邏輯。模型是根據業務邏輯來劃分的,簡單地說就是根據功能來劃分。
3、模型更加關注業務邏輯,而不是數據庫查詢。模型是可以劃分多層的,TP5推薦12劃分的有model層、service層、logic層
4、Db是數據庫訪問層,模型是建立在數據庫訪問層上一個更加抽象的處理業務邏輯層

  • 模型定義

    • 模型都要繼承thinkphp的model這個類
    • 業務足夠簡單,所以會有一個數據表對應一個模型的假象。不是在所有情況下,表和模型是一一對應的,有可能一個模型對應多個表,比如關聯模型就是和多張表都有關聯的。關聯模型相當於數據庫的主表和從表的概念
    • 默認情況下,數據表名和我們的模型是一一對應的,如Banner模型和Banner表,如果不想要一致對應,則可以在Banner模型下指定數據庫中的表
  • 靜態調用還是實例調用

TP5建議使用靜態調用:
第一個原因,靜態方法調用更爲簡潔;
第二個原因從模型的本質意義上來討論,當你實例化出模型對象後該對象纔會對應數據表下的記錄,只有把類實例化了才能代表一個事物。這裏呢,如果我們先實例化一個對象其實就是數據了,然後又使用get方法去獲取數據,就是通過數據再獲取數據,顯得多餘。而靜態調用,就是把模型類當做一張表,獲取數據的過程就是相當於在數據表中查找數據一樣,這樣比較好理解。這裏也只是爲了編程邏輯的完整性和合理性,不過還是可以任意選擇一種,看個人習慣

  • 幾種查詢動詞的總結

get、find、all、select
get和find是一個記錄或一個模型對象,all和select則是一組記錄或一組模型對象。
模型對象可以用以上四種查詢動詞,但是Db類只能使用find和select。因爲Db是模型的基石,模型的內部最終還是要依賴Db來完成對數據庫的訪問等操作

  • ORM(object relation mapping)

1.模型和數據庫訪問層,模型是用來處理業務的,而數據庫訪問層就是用來查詢數據庫的。模型是建立在Db即數據庫訪問層之上的。
2.不要因爲模型的性能稍差就放棄使用模型。
3.使用面向對象的思維來使用和設計模型。
4.模型的底層仍然是數據庫訪問抽象層,模型的強大可以自動地調用數據庫訪問抽象層。

  • 模型性能

模型的性能肯定比原生的SQL稍差,無可否認。在性能要求上差距可以允許的範圍內,性能稍差是可以接收的。
絕大多數中小企業對性能的要求沒那麼高,所以使用ORM模型的方式是可以走的通的,如果你的產品到了很高的量級,對性能要求有一定限制,比如高併發等可以不使用ORM模型的方式,轉而寫原生SQL語句是可以的

模型關聯

關聯關係通常有一個參照模型,這個參照模型我們一般稱爲主模型(或者當前模型),關聯關係對應的模型就是關聯模型,關聯關係是指定義在主模型中的關聯關係,有些關聯關係還會設計到一箇中間表的概念,但中間表不一定需要存在具體的模型。關聯模型本身也是一個普通的獨立模型,具備模型的所有功能。兩個模型之間的關聯關係就是通過關聯方法來定義的

有一點需要注意的是,關聯方法的命名規範是駝峯法,而關聯屬性則一般是小寫+下劃線的方式,系統在獲取的時候會自動轉換對應,讀取user_profile關聯屬性則對應的關聯方法應該是userProfile

  • 一對一關聯

hasOne(‘關聯模型名’,‘外鍵名’,‘主鍵名’,[‘模型別名定義’],‘join類型’);
belongsTo(‘關聯模型名’,‘外鍵名’,‘關聯表主鍵名’,[‘模型別名定義’],‘join類型’);

// User 模型
namespace app\index\model;

use think\Model;

class User extends Model 
{
   public function profile()
   {
       return $this->hasOne('Profile','uid');
   }
}
// Profile 模型
namespace app\index\model;

use think\Model;

class Profile extends Model 
{
    public function user()
    {
        return $this->belongsTo('User');
    }
}
  • 一對多關聯

hasMany(‘關聯模型名’,‘外鍵名’,‘主鍵名’,[‘模型別名定義’]);

//文章模型
namespace app\index\model;

use think\Model;

class Article extends Model 
{
    public function comments()
    {
        return $this->hasMany('Comment','art_id');
    }
}
//評論模型
name app\index\model;

use think\Model;

class Comment extends Model 
{
    public function article()
    {
        return $this->belongsTo('article');
    }
}
  • 多對多關聯

belongsToMany(‘關聯模型名’,‘中間表名’,‘外鍵名’,‘當前模型關聯鍵名’,[‘模型別名定義’]);

//用戶表
namespace app\index\model;

use think\Model;

class User extends Model 
{
    public function roles()
    {
        return $this->belongsToMany('Role');
    }
}
//角色表
namespace app\index\model;

use think\Model;

class Role extends Model 
{
    public function users()
    {
        return $this->belongsToMany('User');
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章