Например, это может быть удобным, когда одна их характеристик основной сущности модели представляет собой не скалярное значение, а некую другую сущность.
Для автоматической загрузки значения такой характеристики я рекомендую перекрывать метод 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; } }