表 directory_country_region
region_id
country_id
code
default_name
485
CN
110000
北京1
表 directory_country_region_name
local
region_id
name
en_US
485
北京2
zh_CN
485
北京3
代码:
1 2 3 4 echo Mage::app()->getLocale()->getLocaleCode(); echo '<br>'; $regionModel = Mage::getModel('directory/region')->load('485'); echo $region = $regionModel->getName();
不同 locale 值的输出:
那么按照这样的逻辑,如果我们按照 region name 来取 region id 的话会怎样呢?
1 2 3 4 5 $regionModel = Mage::getModel('directory/region')->loadByName('北京3', 'CN'); echo '<br>----'; echo $regionModel->getName(); echo '<br>----'; echo $regionModel->getId();
结果是没有输出,如果是这样的:
所以取 region name 是自动根据时区来输出的。但根据名称取 region ,region name 是根据 directory_country_region
的 default_name
来看下这部分实现的源代码: Mage_Directory_Model_Resource_Region 类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 public function loadByName(Mage_Directory_Model_Region $region, $regionName, $countryId) { return $this->_loadByCountry($region, $countryId, (string)$regionName, 'default_name'); } protected function _loadByCountry($object, $countryId, $value, $field) { $adapter = $this->_getReadAdapter(); $locale = Mage::app()->getLocale()->getLocaleCode(); $joinCondition = $adapter->quoteInto('rname.region_id = region.region_id AND rname.locale = ?', $locale); $select = $adapter->select() ->from(array('region' => $this->getMainTable())) ->joinLeft( array('rname' => $this->_regionNameTable), $joinCondition, array('name')) ->where('region.country_id = ?', $countryId) ->where("region.{$field} = ?", $value); $data = $adapter->fetchRow($select); if ($data) { $object->setData($data); } $this->_afterLoad($object); return $this; }