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