Как автоматически загружать в модель данные сразу из нескольких таблиц

[16 июля 2019 г.]    Российская сборка Magento 2.52.2
Magento 2: модули и услуги
magereport.com: составление перечня необходимых для установки заплаток SUPEE
#1 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8995
  • Регистрация: 20.02.2010

03.07.2011 08:45

Зачастую данные модули удобно хранить не в одной, а в нескольких таблицах.
Например, это может быть удобным, когда одна их характеристик основной сущности модели представляет собой не скалярное значение, а некую другую сущность.

Для автоматической загрузки значения такой характеристики я рекомендую перекрывать метод Mage_Core_Model_Mysql4_Abstract::getLoadSelect и там загружать подчинённую таблицу зывовом метода Zend_Db_Select::join.

Конкретный реальный пример из ядра Magento приведён ниже.
В этом примере система вместе с сущностью-заказом загружает характеристику заказа «состояние заказа», которая является отдельной сущностью и чьи значения хранятся в отдельной таблице.

class Mage_Sales_Model_Mysql4_Order_Status extends Mage_Core_Model_Mysql4_Abstract {

    /**
     * Retrieve select object for load object data
     *
     * @param   string $field
     * @param   mixed $value
     * @return  Zend_Db_Select
     */
    protected function _getLoadSelect($field, $value, $object)
    {
        if ($field == 'default_state') {
            $select = $this->_getReadAdapter()->select()
                ->from($this->getMainTable())
                ->join(array('state_table'=>$this->_stateTable), $this->getMainTable().'.status=state_table.status', 'status')
                ->where('state_table.state=?', $value)
                ->order('state_table.is_default DESC')
                ->limit(1);
        } else {
            $select = parent::_getLoadSelect($field, $value, $object);
        }
        return $select;
    }

}



Для коллекций

По схожим причинам может быть выгодно автоматически загружать в коллекцию данные сразу из нескольких таблиц.
Для коллекции я рекомендую перекрывать метод Mage_Core_Model_Mysql4_Collection_Abstract::_initSelect.

Конкретный реальный пример из ядра Magento приведён ниже.
В этом примере система вместе с коллекцией ценовых правил для каждого ценового правила загружает информацию об основном скидочном купоне ценового правила.

class Mage_SalesRule_Model_Mysql4_Rule_Collection extends Mage_Core_Model_Mysql4_Collection_Abstract {
    
    /**
     * Init collection select
     *
     * @return unknown
     */
    public function _initSelect()
    {
        parent::_initSelect();
        $this->getSelect()
            ->joinLeft(
                array('primary_coupon' => $this->getTable('salesrule/coupon')),
                'main_table.rule_id = primary_coupon.rule_id AND primary_coupon.is_primary = 1',
                array('code')
            );
        return $this;
    }    
    
}


Поделиться темой: