文章彙整

Magento 2 ORM 架構淺談 (2)

By Astral Web 10 months agoNo Comments
首頁  /  Magento  /  Magento-2  /  Magento 2 ORM 架構淺談 (2)

在上一次的文章中,我們稍微介紹了 ORM 在Magento 內部的關係,也教大家怎麼實作了一個 包含 ORM 的 Model,今天我們就針對 Collection 的部分,介紹一些好用的方法,讓大家在操作資料表的時候,更能夠得心應手唷!

章節

Magento 2 ORM 架構淺談 (1)

Magento 2 ORM 架構淺談 (2)

Magento 2 ORM 架構淺談 (3)

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 上,傳送門如下:

Github

想要學習更多Magento相關知識,請參考:Magento 教學導覽

以上內容由Astralweb 歐斯瑞編寫製作

 000

推薦文章

Category:
  Magento-2

留下回應

你的電子郵件地址不會被公開.

取得獨家電子商務祕技

建立更好的策略靈感

跟上全球的網路趨勢

絕佳的電商解決方案

電子商務戰略全指南

每月發送電商戰略指南,只要填寫E-mail即可訂閱!

請到您的信箱確認,即可完成訂閱。