Skip to content

Instantly share code, notes, and snippets.

@jrruiz
Created October 31, 2014 13:07
Show Gist options
  • Select an option

  • Save jrruiz/5de41f91c60654a813b2 to your computer and use it in GitHub Desktop.

Select an option

Save jrruiz/5de41f91c60654a813b2 to your computer and use it in GitHub Desktop.
Prestashop sql improvements
<?php
class AdminCartRulesController extends AdminCartRulesControllerCore
{
protected function afterAdd($currentObject)
{
/*
* Omitted code...
*/
// If the new rule has no cart rule restriction, then it must be added to the white list of the other cart rules that have restrictions
if (!Tools::getValue('cart_rule_restriction'))
{
Db::getInstance()->execute('
INSERT INTO `'._DB_PREFIX_.'cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`) (
SELECT id_cart_rule, '.(int)$currentObject->id.' FROM `'._DB_PREFIX_.'cart_rule` WHERE cart_rule_restriction = 1
)');
}
// And if the new cart rule has restrictions, previously unrestricted cart rules may now be restricted (a mug of coffee is strongly advised to understand this sentence)
else
{
// optimization here
$subquery = array_map(
function($row) {
return $row['my_field'];
},
Db::getInstance()->executeS('
SELECT IF(id_cart_rule_1 = '.(int)$currentObject->id.', id_cart_rule_2, id_cart_rule_1) my_field
FROM '._DB_PREFIX_.'cart_rule_combination
WHERE '.(int)$currentObject->id.' = id_cart_rule_1
OR '.(int)$currentObject->id.' = id_cart_rule_2'
)
);
$subquery = implode(',', $subquery);
$ruleCombinations = Db::getInstance()->executeS('
SELECT cr.id_cart_rule
FROM '._DB_PREFIX_.'cart_rule cr
WHERE cr.id_cart_rule != '.(int)$currentObject->id.'
AND cr.cart_rule_restriction = 0
AND cr.id_cart_rule NOT IN (' . $subquery . ')');
foreach ($ruleCombinations as $incompatibleRule)
{
Db::getInstance()->execute('UPDATE `'._DB_PREFIX_.'cart_rule` SET cart_rule_restriction = 1 WHERE id_cart_rule = '.(int)$incompatibleRule['id_cart_rule'].' LIMIT 1');
Db::getInstance()->execute('
INSERT IGNORE INTO `'._DB_PREFIX_.'cart_rule_combination` (`id_cart_rule_1`, `id_cart_rule_2`) (
SELECT id_cart_rule, '.(int)$incompatibleRule['id_cart_rule'].' FROM `'._DB_PREFIX_.'cart_rule`
WHERE active = 1
AND id_cart_rule != '.(int)$currentObject->id.'
AND id_cart_rule != '.(int)$incompatibleRule['id_cart_rule'].'
)');
}
}
}
}
<?php
class CartRule extends CartRuleCore
{
protected function getCartRuleCombinations()
{
$subquery = array_map(
function($row) {
return $row['my_field'];
},
Db::getInstance()->executeS('
SELECT IF(id_cart_rule_1 = '.(int)$this->id.', id_cart_rule_2, id_cart_rule_1) my_field
FROM '._DB_PREFIX_.'cart_rule_combination
WHERE '.(int)$this->id.' = id_cart_rule_1
OR '.(int)$this->id.' = id_cart_rule_2'
)
);
$subquery = implode(',', $subquery);
$array = array();
$array['selected'] = Db::getInstance()->executeS('
SELECT cr.*, crl.*, 1 as selected
FROM '._DB_PREFIX_.'cart_rule cr
LEFT JOIN '._DB_PREFIX_.'cart_rule_lang crl ON (cr.id_cart_rule = crl.id_cart_rule AND crl.id_lang = '.(int)Context::getContext()->language->id.')
WHERE cr.id_cart_rule != '.(int)$this->id.'
AND (
cr.cart_rule_restriction = 0
OR cr.id_cart_rule IN (' . $subquery . ')
)');
$array['unselected'] = Db::getInstance()->executeS('
SELECT cr.*, crl.*, 1 as selected
FROM '._DB_PREFIX_.'cart_rule cr
LEFT JOIN '._DB_PREFIX_.'cart_rule_lang crl ON (cr.id_cart_rule = crl.id_cart_rule AND crl.id_lang = '.(int)Context::getContext()->language->id.')
WHERE cr.cart_rule_restriction = 1
AND cr.id_cart_rule != '.(int)$this->id.'
AND cr.id_cart_rule NOT IN (' . $subquery . ')');
return $array;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment