laravel 學習筆記 —— 資料和模型起步篇

來源:互聯網
上載者:User
自上一篇 《laravel 學習筆記 —— 神奇的服務容器》已經有一年了,很多人都問過關於資料庫部分的文章什麼時候出來。其實不是不想寫,而是沒法寫,因為當時大部分特性都沒用到,以至於我無法以筆記形式給出。經過一年時間,laravel 已被我運用在很多類型的項目裡,或多或少也對資料庫組件瞭解的比較完整了,是時候完善學習筆記序列重要的環節之一 —— 資料庫部分。

Laravel 有三寶,路由、容器和 Eloquent ORM,Eloquent ORM 實際上是 Laravel 架構資料庫組件的一個部分,也是最為重要和常用的,所以我們在說 Laravel 資料庫組件時,往往指的是 Eloquent ORM。當然,資料庫篇的文章肯定要全面講述,這樣有助於理解,也能協助一些在這一塊遇到問題的朋友。

資料庫組件是一個比較獨立的組件,只依賴很少的東西,通過 composer安裝的話,可以在任意一個項目裡使用該組件的全部功能,而不需要安裝 laravel 架構。具體使用方法可到其 github 首頁擷取: https://github.com/illuminate/database

由於篇幅有限,且平時很忙,我將會將資料庫部分文章拆成包括本篇在內的多篇文章,本文作為概覽和文章預告,會對整個資料庫組件的構成做一個大致的講解。

漂亮的結構

Laravel 資料庫組件有著明確的分層,雖然沒有直白的說明,但仍舊能夠從文檔結構、代碼中明顯看得出來。筆者也會按每一層來講解,當然,由於 Eloquent ORM 佔比最高,我將用兩個篇幅來著重講述。

組件大概分了三層:

  • 資料庫連接層
  • 查詢構造層
  • 應用程式層

來看一下每一層有哪些東西,分別對應文檔的哪一部分:

資料庫連接層

資料庫連接層是整個資料庫組件依賴的基礎,這個不言而喻,但是這部分實際上從 文檔 都能夠看得出,本身更多是基於 PDO的封裝,在此基礎上提供了以下幾個主要功能:

  • 更為直觀易用的事務
  • 讀寫分離功能
  • 多種資料庫驅動相容和切換
  • 資料庫事件

這一部分的功能可以通過 Facade 快捷調用(DB 類),文檔已有說明,很明顯,只要是使用過 PDO或者 MySQLi 的都能夠快速上手使用參數綁定和 SQL 預先處理功能。為了便於事件處理,這一部分對增刪改查四個操作每一個都封裝了一個方法,實際上調用方法一致(都是封裝的 PDO 和 PDOStatement 類的方法),僅產生的結果類型有所區別。

這一層很底層,對於需要直接手寫 SQL 操作資料庫的人可以通過這一層訪問,大多數情況下我們不會直接使用(不過事務很常用,我們會在後面的文章講到)。需要注意的是,作為底層,意味著資料庫組件後面所有的功能都是利用這一層實現的,因此這一層務必需要有一個瞭解。

瞭解 PDO 很重要,現代架構資料庫部分基本是基於 PDO實現的。若是作為一名使用到 PHP 5.3 以後版本的 PHPer,連 PDO 都未曾使用甚至都不曾瞭解的,著實應當面壁,要知道 PDO 可是從 PHP 5.1 以後就已經是一個內建擴充,隨 PHP 一同發布。

這一部分不會單獨成文介紹,而是會隨著下面這一部分,在下一篇文章中同時給出講述。

查詢構造層

查詢構造層由 查詢構造器和 (文法)產生器組成,是應用程式層和底層溝通的橋樑,其提供了流暢的提供者,使得開發人員可以以務必優雅的形式建立查詢。雖然現代架構都提供了此類功能,但像 Laravel 這種利用很多 PHP 優秀特性來實現的,很少很少。

你可以通過這樣的方式查詢:

where('score', '>', 0)                           ->where(function (Builder $query) {                               $query->where('code', 'foo')                                     ->orWhere('name', 'like', 'Anvi%');                           })->skip(1)                           ->take(5)                           ->get();

最終會產生這樣的 SQL:

SELECT * FROM users WHERE score > 0 AND (code = 'foo' OR 'name' LIKE 'Anvi%') OFFSET 1 LIMIT 5;

可以看到,查詢構造層的查詢構造器提供了十分直觀的訪問方式,這種方式使得構建 SQL 陳述式的錯誤機率大大降低,而且由於是通過方法訪問,我們很容易對某一類查詢方式進行封裝(這個功能會在後文提到),以提高開發效率。

要時刻記住,所使用的 where 或 groupBy 這類方法,全部是查詢構造器提供的方法,要在開發中明確這一點,哪一些方法是由哪一層、哪一個類的執行個體對象提供的,這樣有助於避免不必要的錯誤,這一點我會在 Eloqent 的那一篇文章中著重講。

查詢構造器提供了優雅的存取方法,而最終輸出 SQL 陳述式的則是(文法)產生器,他會根據當前所選的資料庫驅動產生對應的 SQL 陳述式,最後返回給查詢構造器,組合好用於綁定的參數,調用資料庫連接層返回查詢結果。

實際上,查詢構造器在資料庫組件有兩個,一個是基礎的原生查詢構造器,是查詢構造層提供的,還有個則是 Eloqent ORM 再次封裝的版本,提供了更為進階的關聯查詢方法,這個會在後續著重講解。

應用程式層

這一層就是我們長期使用的部分了,這一層包含了三個大組件: Eloquent ORM、 Migration、 Schema。

這三個皆是基於查詢構造層實現的,Eloquent 出場率最高,當然後兩個也很重要,分別是資料移轉和結構產生器,而資料移轉組件和結構產生器作為 最佳組件 CP往往成雙成對的出現,對這兩位我會單獨開篇介紹的。

Eloquent 作為最最重要的部分,戲份也最多,我將分為幾個篇章來介紹:

  • 模型與資料庫(一些思想上的東西)
  • Eloquent ORM 基礎 (講解 Laravel 的模型,Eloquent 基礎,集合)
  • Eloquent ORM 進階運用 (可複用查詢封裝,事件的運用,Getter 與 Setter)
  • 關聯查詢(各種關聯模型的運用執行個體,關聯查詢各種問題,由於內容很多,將會分為兩篇來講)

關於資料移轉和結構產生器則會在一篇內介紹。

由於資料庫這一塊內容非常之多,我需要慢慢整理很多東西,水平原因,期間不可避免會出現很多紕漏,也希望各路大神予以批評和指正。

作為開篇,即是作為剛要給我補完的方向,亦是一個引導內容,因此在後續文章發布過程中會不可避免的發生些許變動,所以也請各位關注的朋友多多留意~

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.