You can use INSERT IGNORE INTO mysql query with the help of insertFromSelect() method in Magento 2 with use of magento best standard in your module.
Lets we have a query that use the insertFromSelect method to run a query.
Raw SQL Query to add an entry to the small_image attribute from the image attribute value.
INSERT IGNORE INTO `catalog_product_entity_varchar` (`attribute_id`, `store_id`, `value`, `row_id`) SELECT 88, `store_id`, `value`, `row_id` FROM `catalog_product_entity_varchar` WHERE (value != 'no_selection') AND (attribute_id = 87);
You can create SQL queries with Magento best practices,
<?php
declare(strict_types=1);
namespace Rbj\InserFromSelect\Index;
use Magento\Framework\App\ResourceConnection;
use Magento\Framework\DB\Adapter\AdapterInterface;
class InsertFromSelect
{
private const CATALOG_PRODUCT_ENTITY_VARCHAR = 'catalog_product_entity_varchar';
public function __construct(
private readonly ResourceConnection $resourceConnection
) {
}
public function execute()
{
$connection = $this->resourceConnection->getConnection();
$catalogVarcharTable = $connection->getTableName(self::CATALOG_PRODUCT_ENTITY_VARCHAR);
$smallImageAttributeId = 88;
$imageAttributeId = 87;
/** select query */
$select = $connection->select()
->from(
[$catalogVarcharTable],
[new \Zend_Db_Expr($imageAttributeId), 'store_id', 'value', 'row_id']
)
->where("value != 'no_selection'")
->where('attribute_id = ?', $smallImageAttributeId);
$insertFromSelectQuery = $connection->insertFromSelect(
$select,
$catalogVarcharTable,
['attribute_id', 'store_id', 'value', 'row_id'],
AdapterInterface::INSERT_IGNORE
);
/** Run Query */
$connection->query($insertFromSelectQuery);
}
}
In the above code, We have first created an inset ignore into query with the help of the method insertFromSelect(). In the method, insertFromSelect() a fourth parameter is used to add specific values.
You can use any of the given parameters as the fourth argument.
INSERT_ON_DUPLICATE = 1; INSERT_IGNORE = 2; REPLACE = 4;
