Magento 1.6-将用户输入的数组保存为模型集合


Magento 1.6 - Save an array from user input as a collection of models

我正在后端实现一个用户界面,用于向产品添加任意数量的值,就像价格层界面一样。我想知道像这样保存数据通常是如何完成的。

下面是我尝试的一些简化代码(它引发了这个错误:具有相同id"1"的项目已经存在):

$myItemCollection = $product->getMyItemCollection();
if(!$myItemCollection) {
    $myItemCollection = Mage::getModel('my_module/my_item')->getCollection();
}
foreach($product->getMyData('items') as $data) {
    $myItem = Mage::getModel('my_module/my_item')->addData($data);
    // Item with the same id "1" already exist on the second iteration
    $myItemCollection->addItem($myItem);
}
$myItemCollection
    ->setDataToAll('product_id', $product->getId())
    ->save();

$product->getMyData('items')返回如下内容:

array(
    1 => array(
        'foo' => 'bar'
    ),
    2 => array(
        'bin' => 'baz'
    ),
    3 => array(
        'buz' => 'fuz'
    )
)

集合对添加的项使用getId()方法来获取内部$_items数组的数组键。在第二次迭代中,您的错误具有相同id"1"的项目已经存在,这意味着您正在为新模型设置一些值,该值将作为id值返回。

如果getId()返回null,则使用$_items[] = $item将该项添加到集合中,而不会引发该错误。这意味着,如果您使用的是标准模型和资源模型,$data可能与您发布的数组不匹配。

用于返回模型的ID值的键取决于实体的类型
如果该模型使用基于EAV的资源模型(Mage_Eav_Model_Entity_Abstract),则密钥是entity_id,例如array('entity_id' => 1, 'foo' => 'bar')

如果模型使用基于平面表的资源模型(Mage_Core_Model_Resource_Db_Abstract),则主键字段(通常)设置在资源模型的_construct()方法中,作为_init()调用的第二个参数
因此,如果资源模型的初始化看起来像$this->_init('my_module/my_item', 'item_id'),那么要在$data数组上设置的值将是array('item_id' => 1, 'foo' => 'bar')