Jump to content

Optimisation: Insertion Lors D'import


Recommended Posts

Bonjour,

 

 

J'ai surcharger l'import de produit, affin d'ajouter automatiquement des combinaison d’attributs au produits.

 

Je vous passe le principe du mécanisme, mais au final, c'est entre 100 et 500 combinaison qui sont ajouter a chaque produits, avec chacune des références et des prix spécifiques. 

 

en gros, voici l'algorithme

 

- Pour chaque ligne de produit du fichier CSV,

   -> je constitue la liste des combinaisons du produit courant

        - Pour chaque combinaisons de ce produit

           -> j'insert la combinaison dans la BDD.

 

 

1er approche pour l'insertion, je fait quelque chose comme ceci :

$combi = new Combination();
$combi->id_product = $idProduct;
$combi->price = $price
$combi->reference = $reference;
$combi->add();
$combi->setAttributes([$idAttribute01, $idAttribute02, [etc...]]);

Sa fait son taf sans histoire. Mais avec 2 requêtes par combinaison,  si j'ai 200 combinaison, sa fait 400 requetes ... super lourd.

 

2eme approche:

Il y a deux requête par combinaisons car il y a deux table.

$combi->add(); -> insert dans la table "product_attribute"

$combi->setAttributes(...) -> insert dans la table "product_attribute_combinaison".

 

Je constitue donc deux tableau :

 $productAttributes[] = [
                'id_product'=>$idProduct,
                'price'=>$price,
                'reference'=>$reference, 
            ];
$combinaisons =  [$attribute01, $attribute02,...]];

Puis j'insert le tout avec seulement 3 requêtes.

     //insertion dans la table product_attribute
        Db::getInstance()->insert('product_attribute', $productAttributes);

     //récupération des id insérés pour les injecter en suite dans product_attribute__combinaison (
        $query = new DbQuery();
        $query->select('*')
            ->from('product_attribute', 'pa')
            ->where('pa.id_product = '.(int)$productAttributes[0]['id_product']);

        $productAttributes =  $rs = Db::getInstance()->executeS($query);
        $productAttribute_combinaisons = [];
        foreach($productAttributes as $i => $pa){
            foreach($combinaisons[$i] as $idAttribute){
                $productAttribute_combinaisons[] = [
                    'id_product_attribute' =>(int)$pa['id_product_attribute'],
                    'id_attribute'=>(int)$idAttribute
                ];
            }
        }
     // et on insert dans product_attribute_combination
        Db::getInstance()->insert('product_attribute_combination',$productAttribute_combinaisons);

je n''ai donc plus que 3 requêtes, au lieux de 400, bravo moi!

 

 

sauf que je n'utlise ni la méthode Combinaison->add, ni la méthode Combinaison->addAttributes, qui contienne quelque routine pour géré les stock , les prix, certain hook... et qui me faut donc les reproduire, et je peut donc dire adieu a la possiblité de mettre a jour le projet.

 

 

n'y aurai t'il pas une 3eme possibilité ? C'est dommage je trouve le core de prestashop pas assez segmenter, il y a des fonction qui font 500 ligne...
 

Toute les méthode de la class Product permettants de faire sa sont "deprecated". De toute façons en regardant le code, c'est la même chose que la 1er solution ^^.

 

EDIT: je pense que je pourrai avoir un énorme gain de performance si je pouvais envoyé toute les requêtes d'un coup. Un peut comme avec le flush du Manager de doctrine.

Peut on faire pareille avec la class Db ? stocker les requêtes puis les balancé toute d'un coup ?

Edited by Cawet (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...