網(wǎng)路上搜到的解釋是方便切換資料庫,以及避免寫sql。這兩條我不是很理解,
第一條,所謂切換資料庫是指類??似mysql切換到sql server這樣嗎,可是只要表結(jié)構(gòu)一樣,原生sql和查詢建構(gòu)器也不用改啊。
第二條,避免寫冗長sql,這點(diǎn)查詢建構(gòu)器也可以啊
對於查詢建構(gòu)器和orm的區(qū)別,我的理解是查詢建構(gòu)器是一個(gè)產(chǎn)生sql的類,而orm是一個(gè)與表格映射的類,字段映射成成員變數(shù)。我又有個(gè)問題,如果有很多表,很多字段,那麼orm類豈不是很冗長。望指正我的理解哪裡錯(cuò)誤。
$user = DB::table('users')->where('name','Laravel')->first();//laravel查詢構(gòu)造器
$posts = Post::where('id','<',3)->orderBy('id','desc')->take(1)->get();//laravel orm
你說的很對,如果表很多,有很多字段,那麼ORM類就會很冗長。
ORM的本質(zhì)就是將資料庫表及表與表之間的關(guān)係映射到物件及物件關(guān)係上,需要注意的是,這種映射關(guān)係雖然說是雙向的,但是在Object->RDB這個(gè)方向上有一些限制,這是因?yàn)镽DB對於實(shí)體的描述不如Object對於實(shí)體的描述豐富。
關(guān)於你提到的兩個(gè)理由的說明:
方便切換資料庫,個(gè)人認(rèn)為雖然ORM提供了這樣的特性,但是不常見,因?yàn)樵谡鎸?shí)專案中切換資料庫比較少見。
避免寫SQL,這是使用ORM的重要理由,因?yàn)槌淌皆O(shè)計(jì)師比較偷懶,不想學(xué)SQL(即使SQL很易學(xué)),而這也是ORM最初產(chǎn)生的重要原因。
簡單回答下orm是object Relational Mapping縮寫,object是對象,relational是關(guān)係,mapping是映射。物件關(guān)係映射看起來還蠻抽象的,沒錯(cuò),它就是個(gè)抽象概念。從程式設(shè)計(jì)語法來看,就是在具體的操作業(yè)務(wù)物件的時(shí)候,不需要再去和複雜的SQL語句打交道,只需要簡單的操作物件的屬性和方法。
然後回答你的兩個(gè)問題
第一條,mysql和sqlserver是有很多差別的,你在程式中使用的mysql_開頭的函式在sqlserver下都是辨識不了的。那你要如何做到遷移而不改程式碼呢?
第二條,orm包含以下映射關(guān)係,而不僅僅是表與類別的映射。
類別與資料庫中表格的對應(yīng):資料庫中的每一張表格對應(yīng)程式語言中的一個(gè)類別
物件與表中記錄的對應(yīng):關(guān)聯(lián)式資料庫中的一張表可能有多筆記錄,每筆記錄對應(yīng)類別的一個(gè)實(shí)例
類別的屬性與資料庫中表格的欄位的對應(yīng):資料庫中表格的欄位的資料類型與類別中的屬性的類型也是一一對應(yīng)的