2

Magentoのカスタムモジュールを作成していますが、2つのテーブル間に1対多の関係を実装する必要があります。

最も簡単な解決策は、テーブルごとに1つのモデルを作成し、データを個別に保存することですが、このアプローチにはいくつかの制限があると思います(2つではなく1つのトランザクションでデータを保存することを好み、コレクションをロードするときに結合されたデータをロードしたい、 ecc)。

このような状況に対処するための最良の方法は何ですか?複数のテーブルからデータを取得する1つのモデルクラスを持つことは可能ですか?

ありがとうございました

4

1 に答える 1

4

1-n 関係がエンティティ構成ではなく厳密にデータ構成である場合、隣接するテーブルの完全な ORM 表現は必要ありません。

cms/page多くの場合、コア コードでインスピレーションや例を見つけるのは良いことです。そのため、およびcms/blockエンティティ、特にリソース モデルを参照してください。Mage_Cms_Model_Resource_Page::_getLoadSelect()このメソッドは、データをロードするためにリソース モデルによって呼び出されるため、例として次のメソッドを取り上げます。

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

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

結合に注意してください。それぞれに 1 つのエンティティ テーブル (cms_pageおよびcms_block) があることに注意してください。ちなみに、これは ORM が期待するものですが、cms-entity-to-store データを含む追加のテーブルがあります。(cms_page_storeおよびcms_block_store)。後者の 2 つのテーブルのレコードは、独自の ORM クラスによって表されるのではなく、cms/pageおよびcms/blockモデルのリソース クラスによってロードのために更新、削除、または結合されます。

繰り返しになりますが、指定された ORM クラスを介して SQL を処理するかどうかの決定要因は、ビジネス ドメインに由来します。「多くの」テーブルのレコードが、ビジネス ドメインでプレゼンテーションまたは複雑な表現を必要とするものを表している場合は、ORM を介してそれらにアクセスします。

于 2012-09-02T12:49:42.420 に答える