I have created a custom table and update data using model and resource model.
But it always create a new row on hitting ajax how to update row as old data is appear. I think i want to use Update query instead of insert but not have idea where should i change.
My controller file is
<?php
namespace Tym17\AdminSample\Controller\Index;
use Magento\Framework\App\Action\Context;
use Tym17\AdminSample\Model\ReviewsFactory;
class Index extends \Magento\Framework\App\Action\Action
{
protected $_pageFactory;
protected $reviews;
public function __construct(
\Magento\Framework\App\Action\Context $context,
ReviewsFactory $reviews,
\Magento\Framework\View\Result\PageFactory $pageFactory)
{
$this->_pageFactory = $pageFactory;
$this->reviews = $reviews;
return parent::__construct($context);
}
public function execute()
{
$data = $this->getRequest()->getParams();
$reviews = $this->reviews->create();
$reviews->setData('orderid', $data['order_id']);
$reviews->setData('status', $data['payment_status']);
if ($reviews->save()) {
$this->messageManager->addSuccessMessage(__('You saved review'));
} else {
$this->messageManager->addErrorMessage(__('Review was not saved.'));
}
}
}
My model file path ( app/code/Tym17/AdminSample/Model/ResourceModel/Reviews.php )
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
namespace Tym17\AdminSample\Model\ResourceModel;
class Reviews extends \Magento\Framework\Model\ResourceModel\Db\AbstractDb
{
public function _construct()
{
$this->_init('status', 'id');
}
}
1 Answer 1
In Order to update the record you need to make sure that the Primary field of the table is provided to load the model. If the primary field is set to null Magento will create a new record.
Let us assume primary field of your table is named as id. Now the updated code will be
public function execute()
{
$data = $this->getRequest()->getParams();
$reviews = $this->reviews->create();
/* Load record by **id** if it is already available in database*/
/*if(isset($data['id']) && $data['id'] != null ){
$reviewsModel = $reviews->load($data['id']);
}*/
/* Load record by **Order Id** if it is already available in database*/
$reviewsModel = $reviews->load($data['order_id'], 'orderid');
$reviewsModel->setData('orderid', $data['order_id']);
$reviewsModel->setData('status', $data['payment_status']);
if ($reviewsModel->save()) {
$this->messageManager->addSuccessMessage(__('You saved review'));
} else {
$this->messageManager->addErrorMessage(__('Review was not saved.'));
}
}
FYI : You can see in your Model/ResourceModel/Reviews.php that you have declared an _construct() method something like this.
protected function _construct()
{
$this->_init('table_name', 'primary_field_name');
}
Hope it was helpful. Thanks.
-
1Thanks for your response I have added your code. My primary field name is id but it still added the the new row for same records.@AbdulPrits– Prits2020年08月27日 14:57:47 +00:00Commented Aug 27, 2020 at 14:57
-
Any one question is i will not send any $data['id'] so how will it check it database will you please help.Prits– Prits2020年08月27日 14:59:28 +00:00Commented Aug 27, 2020 at 14:59
-
I have updated my model file as well @Abdul please checkPrits– Prits2020年08月27日 15:03:02 +00:00Commented Aug 27, 2020 at 15:03
-
Assuming Order Id as a unique field in your table, I have updated my answer. Main concept is in order to update a record you need to load the record model either by
load()or bycollection().Abdul Pathan– Abdul Pathan2020年08月28日 05:59:22 +00:00Commented Aug 28, 2020 at 5:59 -
Thanks it solves my issue @AbdulPrits– Prits2020年08月28日 06:29:27 +00:00Commented Aug 28, 2020 at 6:29
Explore related questions
See similar questions with these tags.