2010-12-07 6 views
0

Je serai rapide et simple à ce sujet. Fondamentalement, j'ai besoin de fusionner plusieurs factures (objet) rapidement et rapidement.OO question de performance

Une idée simple est de

$invoice1 = new Invoice(1); 
$invoice2 = new Invoice(2); 
$invoice3 = new Invoice(3); 
$invoice1->merge($invoice2,invoice3); 
$invoice1->save(); 

Puisque chaque objet interrogera ses propres données, le nombre de requêtes augmente à mesure que le nombre de factures nécessaires à la fusion augmente.

Cependant, ceci est un cas où une seule requête

SELECT * FROM invoice WHERE id IN (1,2,3) 

suffit, mais la mise en œuvre ne sera pas aussi élégant que ci-dessus.

repères initiaux sur les données de l'échantillon indique une diminution 2,5x-3x la vitesse au-dessus en raison du grand nombre de requêtes MySQL.

conseils s'il vous plaît

Répondre

2

Utilisez une usine de facture. Vous lui demandez des factures en utilisant différentes méthodes. Le plus récent (n) get (id) get (tableau (id, id, id)) ainsi de suite, et il retourne des tableaux de factures ou des objets de facture unique.

<?php 
    $invoice56 = InvoiceFactory::Get(56); // Get's invoice 56 
    $invoices = InvoiceFactory::Newest(25); // Get's an array of the newest 25 invoices 
?> 
+1

aussi, jetez un oeil à [ 'func_get_args()'] (http: // php.net/manual/fr/function.func-get-args.php) afin que la même implémentation gère 'Get (id)', 'Get (idA, idB)', et 'Get (id1, id2,. .. idN) '. – jensgram

+0

c'est une option, bien que généralement je préfère ne pas le faire parce que le tableau indique à quelqu'un qui traverse la méthode en cours d'utilisation ce qu'il fait et accepte sans le chercher. – DampeS8N

0

Pourriez-vous faire l'objet paresseux Invoice et laisser tout merge de charge qui n'a pas été chargé?

0

Assurez-vous de toujours travailler sur la même connexion db. Vérifiez qu'il ne se reconnecte pas dans un thread d'exécution de script.

0

Je pourrais vous suggérer d'utiliser un réel ORM (mapping relationnel d'objet) afin de créer une séparation entre vos requêtes réelles et les objets utilisés. Jetez un oeil à Propel ou (ma préférée) Doctrine (version 2 est très facile à utiliser)

de cette façon, vous pourriez avoir exactement ce que vous voulez exactement de la même quantité de code ...