我正在后端实现一个用户界面,用于向产品添加任意数量的值,就像价格层界面一样。我想知道像这样保存数据通常是如何完成的。
下面是我尝试的一些简化代码(它引发了这个错误:具有相同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')
。