Magento 2 ORM 架構淺談 (1)
Magento 是一個包裝非常完整的 Framework ,除了實踐了許多設計模式( Design Pattern )的精神,也還有一些其他的 Pattern 在裡面,像是 ORM 的架構就是其中的一種,那我們今天就一起來了解 ORM 在 Magento 2 裡面有哪些好用的方法吧!
章節
Magento 2 ORM 架構淺談 (1)
執行環境:
Ubuntu Linux 16.04
PhpStorm 2017.3
(好拉,其實跟環境沒關係。。)
1.什麼是 ORM :
ORM,全名是 Object-Relational Mapping ( 對象關係映射 ),是一種程式設計模式,用於實現物件導向語言裡不同類型系統的資料之間的轉換。它的作用是在關聯資料庫數據庫和實體( Entity )之間作一個封裝,這樣,我們在具體的操作 Object 的時候,就不需要再去和複雜的 SQL 語句打交道,只需簡單的操作對象的 Property和 Method。
2.什麼時候需要使用 ORM:
在開發期間,常常會與資料庫做互動,無論是在 Controller、View、Model 裡面,都會有可能使用到資料庫四大功能:新增 ( Inser t)、刪除( Delete )、查詢( Select )、修改( Update ),而透過 ORM 幫我們封裝好的方法,就能夠快速的取得我們想要的資料,或是達到我們想要對資料庫做的操作。
3.Magento 內 Model 建立:
想要使用方便的 ORM 架構,必須先從建立資料表(Table)及 Model 開始,建立資料表超過本章的教學範圍,故先從 Model 開始講起。在 Magento 2 架構中,一張資料表原則以對應到一個 Model 為主(當然你想要多個也可以),在建立 Model 的時候,需要產生 三個檔案,以我們的 Model 名稱 Employee 為例,三個 Class 分別如下:
(1) Vender\Module\Model\Employee:
<?php namespace Astralweb\ORM\Model; use \Magento\Framework\Model\AbstractModel; class Employee extends AbstractModel { /** * Initialize resource model * @return void */ public function _construct() { $this->_init('Astralweb\ORM\Model\ResourceModel\Employee'); } }
(2) Vender\Module\Model\ResourceModel\Employee:
<?php namespace Astralweb\ORM\Model\ResourceModel; use \Magento\Framework\Model\ResourceModel\Db\AbstractDb; class Employee extends AbstractDb { /** * Initialize resource * * @return void */ public function _construct() { $this->_init('employee_entity', 'entity_id'); } }
(3) Vender\Module\Model\ResourceModel\Employee:
<?php namespace Astralweb\ORM\Model\ResourceModel\Employee; use \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection; class Collection extends AbstractCollection { /** * Initialize resource collection * * @return void */ public function _construct() { $this->_init('Astralweb\ORM\Model\Employee', 'Astralweb\ORM\Model\ResourceModel\Employee'); } }
4.取得 ORM Collection:
Magnento 2 中若要取得 Collection 來操作 ORM 的話,有兩種方式,第一種是先宣告 Model Entity ,由 Entity 中使用 getCollection() 的方法取得,第二種是直接建立一個 Collection Class,我們來看以下兩種在宣告上的差異。
(1)宣告Model Entity方式:
<?php /* * Object Manager 是為了示範上較為方便 * 官方是較不建議這麼做的 * 在實作過程中,應該使用 DI 的方式注入 * */ /* @var $employeeEntity \Astralweb\ORM\Model\Employee */ $objectManager = ObjectManager::getInstance(); $employeeEntity = $objectManager->get('Astralweb\ORM\Model\Employee'); $employeeCollection = $employeeEntity->getCollection();
(2)宣告Collection 方式:
/* @var $employeeCollection \Astralweb\ORM\Model\ResourceModel\Employee\Collection */ $objectManager = ObjectManager::getInstance(); $employeeCollection = $objectManager->get('Astralweb\ORM\Model\ResourceModel\Employee\Collection');
在取得 Collection 之後,就可以開始對 ORM 資料表進行操作了,剩下的操作細節,我們留至下一篇會有更詳盡的說明!
以上範例程式皆放在 Github 上,傳送門如下:Github
想要學習更多Magento相關知識,請參考:Magento 教學導覽
我要留言