EAV and Flat Table Models in the Same Module

If you ever want to develop a module that has both EAV Models and Flat Table Models, you can use the info here.

As usual, there’s a lot of assumed knowledge regarding module development here, both flat and EAV. If you haven’t already, first go through all of Alan Storm’s tutorials here:

http://alanstorm.com/category/magento

Specifically Magento Models and ORM Basics, Magento Setup Resources and Magento ORM: Entity Attribute Value; Part 1.

Once you’ve done those, here’s how you combine them.

Your modules config.xml needs to look like this. The different parts being four nodes under models (two for EAV, two for Flat), and new nodes for read, write and setup in the resources node.

<config>
    ...
    <global>
        ...
        <models>    
            <modulename>
                <class>Mby_Modulename_Model</class>
                <resourceModel>modulename_resource_eav_mysql4</resourceModel>
            </modulename>
            <modulename_resource_eav_mysql4>
                <class>Mby_Modulename_Model_Resource_Eav_Mysql4</class>               
                <entities>
                    <thing>
                        <table>modulename_things</table>
                    </thing>
                </entities>
            </modulename_resource_eav_mysql4>
            <modulename_flat>
                <class>Mby_Modulename_Model_Flat</class>
                <resourceModel>modulename_flat_mysql4</resourceModel>
            </modulename_flat>
            <modulename_flat_mysql4>
                <class>Mby_Modulename_Model_Flat_Mysql4</class>
                <entities>
                    <item>
                        <table>modulename_items</table>
                    </item>
                </entities>
            </modulename_flat_mysql4>
        </models>
        <resources>
            <modulename_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </modulename_write>
            <modulename_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </modulename_read>
            <modulename_setup>
                <setup>
                    <module>Mby_Modulename</module>
                    <class>Mby_Modulename_Entity_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </modulename_setup>
            <modulename_flat_write>
                <connection>
                    <use>core_write</use>
                </connection>
            </modulename_flat_write>
            <modulename_flat_read>
                <connection>
                    <use>core_read</use>
                </connection>
            </modulename_flat_read>
            <modulename_flat_setup>
                <setup>
                    <module>Mby_Modulename</module>
                    <class>Mby_Modulename_Entity_Mysql4_Setup</class>
                </setup>
                <connection>
                    <use>core_setup</use>
                </connection>
            </modulename_flat_setup>
        </resources>
        ...
    </global>
    ....
</config>

Ensure your folder structure looks like this:

/app/code/local/Mby/Modulename
/app/code/local/Mby/Modulename/Block
/app/code/local/Mby/Modulename/controllers
/app/code/local/Mby/Modulename/Entity
/app/code/local/Mby/Modulename/Entity/Mysql4
/app/code/local/Mby/Modulename/etc
/app/code/local/Mby/Modulename/Model
/app/code/local/Mby/Modulename/Model/Flat
/app/code/local/Mby/Modulename/Model/Flat/Mysql4
/app/code/local/Mby/Modulename/Model/Resource
/app/code/local/Mby/Modulename/Model/Resource/Eav
/app/code/local/Mby/Modulename/Model/Resource/Eav/Mysql4
/app/code/local/Mby/Modulename/sql
/app/code/local/Mby/Modulename/sql/modulename_setup
/app/code/local/Mby/Modulename/sql/modulename_flat_setup

From here, put your install/upgrade scripts in their necessary folders in /sql.

Then create these two Setup classes in /Entity (EAV) and /Entity/Mysql4 (Flat):

<?php
class Mby_Modulename_Entity_Setup extends Mage_Eav_Model_Entity_Setup
{
}
<?php
class Mby_Modulename_Entity_Mysql4_Setup extends Mage_Core_Model_Resource_Setup
{
}

Define your models’ class names as per usual (Mby_Modulename_Model_Thing and Mby_Modulename_Model_Flat_Item).
When you’re initialising your models, use these:

Mage::getModel("modulename/thing");
Mage::getModel("modulename_flat/item");

And there you have it.

Leave a comment