This is what you have done here
$data = array('appid'=>'new_appid','custid'=>1,'info'=>'info');
$model = Mage::getModel('interface/data')->setData($data);
$model->save();
Here I am assuming appid
is the primary_key
of the entiry interface/data
.
What is this code ?
Basically what you are doing here is, instantiate your entity, setting some value on that entity and then perform a save action.
What actually happens !
What you are expecting is an INSERTION, but due to the data available to the entity, Magento will try to do an UPDATE by default.
Why It happens so ?
This is because your entity has it's primary_key
(ie appid
) is already set with your custom value new_appid
. Since the primary_key
is set, Magento by default, assume you want to perform an UPDATE
. So it will try to find a record with appid = 'new_appid'
. But it will fail in this operation since such data is not existing in database.
How can you overcome this ?
But there is a way to do an INSERT rather than doing an UPDATE if the primary key is set. To perform this, you need to set _isPkAutoIncrement
to false
. By default,this value is set to yes
which indicates that we need an update if primary key is set. setting this value to false
tells to Magento that, I need an INSERT and not an UPDATE. So put this in your model file.
protected $_isPkAutoIncrement = false;
The most simple solution for your own model is to get factory using di and then create 1 copy (or load it), fill it in with data and save. Here is the example with the model called Module:
class Rent extends Action {
protected $request;
protected $_moduleFactory;
public function __construct(Context $context, moduleFactory $moduleFactory) {
$this->_moduleFactory = $moduleFactory;
parent::__construct($context);
}
public function execute() {
$model = $this->_moduleFactory->create();
$data = $this->getRequest()->getPost();
if (isset($data['id'])) {
$model->load($data['id']);
}
$model->setData($data);
$model->setName($data['name']);
$model->save(); // now deprecated, but works fine if you have no repository
$resultJson = $this->resultFactory->create(ResultFactory::TYPE_JSON);
$resultJson->setData($data['name']);
return $resultJson;
}
}
Best Answer
Use
insertMultiple
function of classMagento\Framework\App\ResourceConnection
Now you can use
insertMultiple()
function like