北京内蒙古

db和dbc的區別 Laravel5.2中Eloquent與DB類的區別是什么

時間:2019-10-07 09:48:32作者:佚名來源:www.xzluce.live 當前位置:首頁 > 數碼 手機閱讀

要了解這些先看看關于數據庫組件的那些事兒(就是 Eloquent ORM)

數據庫組件大概分了三層:

數據庫連接層

查詢構造層

應用層

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

數據庫連接層

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

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

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

查詢構造層

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

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

<?php
$query = DB::table('users')->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 這類方法,全部是查詢構造器提供的方法,要在開發中明確這一點,哪一些方法是由哪一層、哪一個類的實例對象提供的,這樣有助于避免不必要的錯誤.

查詢構造器提供了優雅的訪問方法,而最終輸出 SQL 語句的則是(語法)生成器,他會根據當前所選的數據庫驅動生成對應的 SQL 語句,最后返回給查詢構造器,組合好用于綁定的參數,調用數據庫連接層返回查詢結果。

實際上,查詢構造器在數據庫組件有兩個,一個是基礎的原生查詢構造器,是查詢構造層提供的,還有個則是 Eloqent ORM 再次封裝的版本,提供了更為高級的關聯查詢方法

應用層

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

這三個皆是基于查詢構造層實現的,Eloquent 出場率最高,當然后兩個也很重要,分別是數據遷移和結構生成器,而數據遷移組件和結構生成器作為 最佳組件 CP 往往成雙成對的出現。

作為應用層,肯定是基于更為底層的組件實現的,也就是你疑惑的地方。其實想通就好了,無非是 ORM 再次封裝并提供了更多的功能(主要是關聯查詢)。

相關文章:

本月排行

隨機推薦

d走势图带连线专业版