2012-03-05 18 views
4

Image、SliderおよびSliderImageAssocの3つのテーブルをマッピングする3つのモデル。この場合、1つの画像を複数のスライダに「リンク」させることができるため、1対多です。カスタムMagentoモデル間の多対多または一対多の関係

私が慣れ親しんだZFウェイは、3つのモデルを提案し、特別な内部データが格納されているので、$ imageRow-> getSliderViaSliderImageAssoc()のようなことができます。その特定の画像モデル

私の質問は、マゼンタでどのように正確に関連するモデルを取得するのですか?私はsetParentFieldNameという名前のメソッドを見たことがあるが、私はそれらがコアにあるとは思わない。

foreach ($model->getCollection() as $model) { 
    $parentRow  = $model->getParent('some/model/name'); 
    $dependentRowset = $model->getChildren('some/other/model/name'); 
} 

PS:必ずしもZFスタイルのフェッチを使用する必要はありません。

答えて

7

Magentoでは、私が知っている限り、エンティティテーブル関係の一般的なマッピングはサポートされていません。リソース・モデルとリソース・コレクションにヘルパー・メソッドを追加して、必要に応じて選択オブジェクトに結合を追加することをお勧めします。

ここ

コレクションに追加のデータをロードするために述べたユーティリティメソッドアプローチのコアからの例である:呼び出された場合

// from Mage_Catalog_Model_Resource_Product_Collection::joinUrlRewrite() 
public function joinUrlRewrite() 
{ 
    $this->joinTable(
     'core/url_rewrite', 
     'entity_id=entity_id', 
     array('request_path'), 
     '{{table}}.type = ' . Mage_Core_Model_Url_Rewrite::TYPE_PRODUCT, 
     'left' 
    ); 

    return $this; 
} 

core_url_rewriteテーブルは、製品エンティティテーブルと結合されています。

結合されたデータを毎回ロードする必要がある場合は、リソース・モデルでは_getLoadSelect()メソッド、コレクションでは_initSelect()メソッドを使用できます。

// from Mage_Cms_Model_Resource_Page::_getLoadSelect() 
protected function _getLoadSelect($field, $value, $object) 
{ 
    $select = parent::_getLoadSelect($field, $value, $object); 

    if ($object->getStoreId()) { 
     $storeIds = array(Mage_Core_Model_App::ADMIN_STORE_ID, (int)$object->getStoreId()); 
     $select->join(
      array('cms_page_store' => $this->getTable('cms/page_store')), 
      $this->getMainTable() . '.page_id = cms_page_store.page_id', 
      array()) 
      ->where('is_active = ?', 1) 
      ->where('cms_page_store.store_id IN (?)', $storeIds) 
      ->order('cms_page_store.store_id DESC') 
      ->limit(1); 
    } 

    return $select; 
} 

例それはに非常に似ているので、(私はそれをここに投稿しないだろうよMage_CatalogInventory_Model_Resource_Stock_Item_Collection::_initSelect()に参加を見つけることができます_initSelect()用:ここ
cms/pageリソースモデルからそのための一例です_getLoadSelect()の例)。

一部のモジュールでは、コレクションの結合をモジュールの「外側」、つまり在庫アイテムコレクションMage_CatalogInventory_Model_Resource_Stock_Item::addCatalogInventoryToProductCollection($productCollection)から設定します。ここで、cataloginventoryモジュールは、製品コレクション選択オブジェクトを使用して、結合されたデータを追加します。

最後に、別のアプローチを行う_afterLoad()方法で必要なデータをロードすることである別の選択(参加と比較して):これはまた、コレクションの*_load_afterイベントを使用して行うことができる

// from Mage_Cms_Model_Resource_Page_Collection::_afterLoad() 
protected function _afterLoad() 
{ 
    if ($this->_previewFlag) { 
     $items = $this->getColumnValues('page_id'); 
     $connection = $this->getConnection(); 
     if (count($items)) { 
      $select = $connection->select() 
        ->from(array('cps'=>$this->getTable('cms/page_store'))) 
        ->where('cps.page_id IN (?)', $items); 

      if ($result = $connection->fetchPairs($select)) { 
       foreach ($this as $item) { 
        if (!isset($result[$item->getData('page_id')])) { 
         continue; 
        } 
        if ($result[$item->getData('page_id')] == 0) { 
         $stores = Mage::app()->getStores(false, true); 
         $storeId = current($stores)->getId(); 
         $storeCode = key($stores); 
        } else { 
         $storeId = $result[$item->getData('page_id')]; 
         $storeCode = Mage::app()->getStore($storeId)->getCode(); 
        } 
        $item->setData('_first_store_id', $storeId); 
        $item->setData('store_code', $storeCode); 
       } 
      } 
     } 
    } 

    return parent::_afterLoad(); 
} 

又はモデル。

+0

コアでこれらのサンプルがどこにあるのかについて具体的にお考えですか? – nevvermind

+0

答えに例を追加しました。 – Vinai

+0

とてもいいです。ありがとう。 – nevvermind