Reading list Switch to dark mode

    How to save a custom column value in Product Review Details

    Updated 15 May 2022

    Hello Friends!!!

    In this blog, we will learn how we can save a custom column’s value in a product review details record table in the database. To achieve this functionality, we will follow the below steps:

    1. We will create our custom_column in the review_detail record table in the app/code/Vendor/Module/etc/db_schema.xml file.

    <?xml version="1.0"?>
    <schema xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Setup/Declaration/Schema/etc/schema.xsd">
        <!--Adding custom_column field in review_detail table-->
        <table name="review_detail" resource="default" comment="Review Detail">
            <column xsi:type="int" name="custom_column" 
                unsigned="true" padding="2" 
                nullable="false" default="0" 
                comment="Custom Column"/>
        </table>
    </schema>

    2. Now, we will create an events.xml file inside the app/code/Vendor/Module/etc directory. And we will add our custom observer class for the review_save_after event.

    <?xml version="1.0"?>
    
    <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
        <event name="review_save_after">
        <observer name="wk_update_product_review_after_observer"
          instance="Vendor\Module\Observer\SaveReviewAfter"/>
      </event>
    </config>

    3. Now, we will create a SaveReviewAfter.php file inside the app/code/Vendor/Module/Observer directory.

    <?php
    namespace Vendor\Module\Observer;
    
    use Magento\Framework\Event\ObserverInterface;
    use Magento\Framework\Message\ManagerInterface;
    
    class SaveReviewAfter implements ObserverInterface
    {
        /**
         * @var ManagerInterface
         */
        private $_messageManager;
    
        /**
         * @param ManagerInterface $messageManager
         * @param \Magento\Framework\App\RequestInterface $request
         * @param \Magento\Framework\App\ResourceConnection $resource
         */
        public function __construct(
            ManagerInterface $messageManager,
            \Magento\Framework\App\RequestInterface $request,
            \Magento\Framework\App\ResourceConnection $resource
        ) {
            $this->_request        = $request;
            $this->_resource       = $resource;
            $this->_messageManager = $messageManager;
        }
    
        /**
         * Execute Method to save user id in review_detail record table
         * 
         * @param \Magento\Framework\Event\Observer $observer
         * @return void
         */
        public function execute(\Magento\Framework\Event\Observer $observer)
        {
            try {
                    $review = $observer->getEvent()->getDataObject();
                    $connection = $this->_resource;
                    $value = 12;
                    $tableName = $connection->getTableName('review_detail');
                    $detail = [
                        'custom_column' => $value,
                    ];
    
                    $select = $connection->getConnection()->select()
                        ->from($tableName)
                        ->where('review_id = :review_id');
                    $detailId = $connection->getConnection()
                        ->fetchOne($select, [':review_id' => $review->getId()]);
    
                    if ($detailId) {
                        $condition = ["detail_id = ?" => $detailId];
                        $connection->getConnection()->update($tableName, $detail, $condition);
                    } else {
                        $detail['store_id'] = $review->getStoreId();
                        $detail['customer_id'] = $review->getCustomerId();
                        $detail['review_id'] = $review->getId();
                        $connection->getConnection()->insert($tableName, $detail);
                    }
                
            } catch(Exception $e){
                $this->_messageManager->addError($e->getMessage());
            }
        }
    }

    Now, we will execute the setup upgrade command and flush the cache, then we will save the review and check the result.

    Hope this will be helpful.
    Thanks 🙂

    Searching for an experienced
    Magento 2 Company ?
    Find out More
    . . .

    Leave a Comment

    Your email address will not be published. Required fields are marked*


    Be the first to comment.

    Back to Top

    Message Sent!

    If you have more details or questions, you can reply to the received confirmation email.

    Back to Home