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

Вход
Регистрация
Помощь

