Created
October 31, 2014 13:07
-
-
Save jrruiz/5de41f91c60654a813b2 to your computer and use it in GitHub Desktop.
Prestashop sql improvements
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?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'].' | |
| )'); | |
| } | |
| } | |
| } | |
| } | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?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