Magento 2 ORM 架構淺談 (2)
在上一次的文章中,我們稍微介紹了 ORM 在Magento 內部的關係,也教大家怎麼實作了一個 包含 ORM 的 Model,今天我們就針對 Collection 的部分,介紹一些好用的方法,讓大家在操作資料表的時候,更能夠得心應手唷!
章節
Magento 2 ORM 架構淺談 (2)
1.什麼是 Collection :
Collection 是 Magento 內的操作資料庫的一種類別,裡面實作了許多資料庫的查詢語句的方法( Method ),讓我們用很直觀的方式取得資料庫內資料,並且也不用使用落落長的 SQL 語法,聽起來是不是方便很多呢?
2.取得 Collection 的方式:
在上一篇的文章裡面,我們有提到兩種方式可以取得 Collection ,一種是宣告 Model,透過 getCollection() 的 Method 來取得,另外一種就是直接宣告 Colleciton 類別。如果上一篇沒有看過的朋友,可以先去看完上一篇介紹再過來喲。(上一篇傳送門)
3.Collection 方法介紹:
(a). addFieldToSelect 方法
這是最常用的方法沒有之一,在每個查詢語句的一開始,都會接這個方法來使用,說明在select 語句中要選擇什麼欄位,或是設定 Alias 都可以在這個方法中操作:
/*選擇全部欄位*/ $employeeCollection->addFieldToSelec('*'); /*選擇單一欄位*/ $employeeCollection->addFieldToSelec('entity_id'); /*選擇單一欄位,給予別名*/ $employeeCollection->addFieldToSelec('entity_id as id');
(b). addFieldToFilter 方法
這是在開發中第二常用到的查詢語句,相當於 SQL 的 where 子句,接下來介紹幾種操作的方式,基本上這些方法可以 Cover 掉決大部分的查詢,如果不夠使用,你想要知道更多,可以參考此篇
/*查詢 entity_id 等於 (Equals) 1 的資料*/ $employeeCollection->addFieldToFilter('entity_id', 1); /*查詢 entity_id Not Equals 1 的資料 */ $employeeCollection->addFieldToFilter('entity_id', ['neq' => '1']); /*查詢 entity_id 存在陣列中的資料*/ $array = [1, 2, 3, 4, 5]; $employeeCollection->addFieldToFilter('entity_id', ['in' => $array]); /*查詢 entity_id Not In 陣列中的資料 */ $array = [1, 2, 3, 4, 5]; $employeeCollection->addFieldToFilter('entity_id', ['nin' => $array]); /*查詢 name Not null 的資料 */ $employeeCollection->addFieldToFilter('name', ['notnull' => true]); /*查詢 entity_id Greater Than 5 的資料 */ $employeeCollection->addFieldToFilter('entity_id', ['gt' => 5]); /*查詢 entity_id Less Than 5 的資料 */ $employeeCollection->addFieldToFilter('entity_id', ['lt' => 5]);
(c). Sort 排序的方法
/* 排序 entity_id 做排序 */ $employeeCollection->setOrder('entity_id'); /* 排序 entity_id 做倒序 */ $employeeCollection->setOrder('entity_id','desc');
(d). 分頁的方法
在查詢過程中往往會使用分頁的功能,但是如果是純 SQL 語句,需要自己撰寫 limit 等等,Collection 裡面也包含了分頁的功能,讓我們不用自己去實作。
/*設定 每頁顯示幾筆 */ $employeeCollection->setPageSize(3); /*設定 每頁顯示幾筆 */ $employeeCollection->setCurPage(1);
(e). 取得資料
在查詢語句的最後,通常都是以取得 Entity 做結尾,但是除了可以取得 Entity 之外,還有幾種方法如下:
/** * 取得 Collection * 若是不使用此方法也可以直接取得 Collection **/ $employeeCollection->getItems(); /** * 取得 Entity 物件 * 以本篇為例,會回傳 employee 的 model Entity **/ $employeeCollection->getFirstItem(); /* 取得 全部的 ID */ $employeeCollection->getAllIds();
3. Collection 串接方法:
在看完上述幾種查詢語句之後,是不是覺得在查詢上變的非常方便呢?我們來看看如果多個條件語句組合再一起的時候的實作方式吧!另外在實作的時候,因為 Collecion 大部分的 Method 都是回傳 自己本身 $this ,所以可以用串接的方式取得資料,這不僅程式看起來非常美觀,而且也大幅增加了閱讀性與可靠性。對於程式的後續維護有很大的幫助。
/* * 查詢條件: * 性別:男 * 年齡:大於30 * 部門別:行銷部 * 排序:員工id 倒續 * 每頁數量: 10 筆 * 當前頁面:第 1 頁 * */ $employees = $employeeCollection ->addFieldToSelect('*') ->addFieldToSelect('gender', '男') ->addFieldToSelect('age', ['gt' => 30]) ->addFieldToSelect('department', 'marketing') ->setOrder('entity_id', 'desc') ->setPageSize('10') ->setCurPage(1) ->getItems();
4. Collection 取得資料:
一般我們大部分會使用 getItem()的方法取得資料,但是 他回傳的是 Collecion ,要怎麼樣法資料取出來?
/* 取得資料*/ /* @var $employees \Astralweb\ORM\Model\Employee[] */ $employees = $employeeCollection ->addFieldToSelect('*') ->addFieldToSelect('gender', '男') ->getItems(); /* 使用 for 迴圈取得 每個 entity 的資料 */ foreach ($employees as $employee) { print_r($employee->getData()); }
getData() 的方法是將取得的資料轉換成 Array 後丟出來,有時候較難處理。另外也可以把 $employee 當作物件來操作,取資料的方法就會變成:
/* 取得資料*/ /* @var $employees \Astralweb\ORM\Model\Employee[] */ $employees = $employeeCollection ->addFieldToSelect('*') ->addFieldToSelect('gender', '男') ->getItems(); /* 使用 for 迴圈取得 每個 entity 的資料 */ foreach ($employees as $employee) { /* * 除了getEntityId 的方法之外 * 其餘的方法,都是Magento自動從資料表中欄位生成 * 轉換原則: * 1. get+欄位名稱 * 2.字首改大寫 * 3.底線移除 * 4.底線移除後第一個字首也為大寫 * * ex: * name => getName(); * sec_department => getSecDepartment(); * */ $employee->getEntityId(); $employee->getName(); $employee->getAge(); $employee->getDepartment(); $employee->getGender(); }
看出來中間的差異了嗎?以上就是今天的對於 Collection 的操作,希望大家會喜歡!
以上範例程式皆放在 Github 上,傳送門如下:
我要留言