laravel框架中Eloquent ORM的底層實現
在Laravel框架中,Eloquent ORM擴展的底層依然使用的是查詢構造器實現的,這裡通過簡單對比兩者的區別來理解Active Record模式的思想。在查詢構造器中訪問資料表時需要通過table()函數給定表名,而在Eloquent ORM中每個類就對應一個資料表;查詢構造器查詢結果返回的是資料陣列,
1.模型類的創建;下面介紹模型類的創建和操作。一般模型類存放在laravelapp目錄下,當然也可以根據實際需求放置在其他位置,
2.模型類的實現原理;在新創建的模型類中其實什麼都沒有做,就可以實現對資料庫操作的相關功能,
這裡首先通過“new static;”語句生成一個模型類實例,用到了後期靜態繫結,生成AppUser類的實例,在本實例中,因為沒有傳遞任何參數,所以構造函數並沒有執行有意義的工作,這部分將在後期封裝資料時再來介紹。
Eloquent ORM的底層使用了查詢構造器來實現,這裡通過newBaseQueryBuilder()函數創建一個基礎查詢構造器,而這個基礎查詢構造器中的資料庫連接最終也是通過資料庫控制器(IlluminateDatabaseDatabaseManager類實例)的connection()函數實現的。在完成基礎查詢構造器的產生實體後,通過newEloquentBuilder()函數對該查詢構造器進行封裝,實現Eloquent查詢構造器的創建。
在完成Eloquent查詢構造器的產生實體後,也就獲取了與資料庫的連接、SQL語法規則和結果處理的功能,因為對資料庫的操作不再以陣列的形式交互,而是通過這個模型類實例來與資料庫進行交互。資料表名稱是通過Model類物件的getTable()函數獲取的,如果物件中的$table屬性存在值,則使用該資料表名,如果不存在,則以模型類名的複數作為資料表名,即通過代碼“str_replace('','',Str::snake(Str::plural(class_basename($this))));”實現,這就是為什麼創建的模型類沒有指定資料表名,依然可以操作資料庫中的資料表的原因,在本實例中,預設的資料表名為“users”。
在完成Eloquent查詢構造器的產生實體後,也就獲取了與資料庫的連接、SQL語法規則和結果處理的功能,因為對資料庫的操作不再以陣列的形式交互,而是通過這個模型類實例來與資料庫進行交互。資料表名稱是通過Model類物件的getTable()函數獲取的,如果物件中的$table屬性存在值,則使用該資料表名,如果不存在,則以模型類名的複數作為資料表名,即通過代碼“str_replace('','',Str::snake(Str::plural(class_basename($this))));”實現,這就是為什麼創建的模型類沒有指定資料表名,依然可以操作資料庫中的資料表的原因,在本實例中,預設的資料表名為“users”。