2010-12-07 118 views
0

我會在這方面快速簡單。 基本上我需要快速,快速地合併多個發票(對象)。面向對象性能問題

一個簡單的想法是

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

由於每個對象將查詢它自己的數據,查詢數量增加,因爲被合併的增加需要發票的數量。

然而,這是在一個單一的查詢

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

就足夠了,但執行不會像上面一樣優雅的情況下。

樣本數據的初始基準測試結果表明,由於mysql查詢的數量龐大,上述速度降低了2.5x-3x。

建議請

回答

2

使用發票工廠。您可以使用各種方法向其索要發票。 newest(n)get(id)get(array(id,id,id))等等,並返回發票或單個發票對象的數組。

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

此外,看一看[`func_get_args()`](HTTP:// (id),Get(idA,idB)和Get(id1,id2,...)。 .. idN)`。 – jensgram 2010-12-07 14:24:19

0

你能做出Invoice對象懶惰,讓尚未加載merge負載的一切嗎?

0

確保您始終使用相同的db連接。檢查它是否在一個腳本執行線程中不重新連接。

0

我可以建議看看使用實際的ORM(對象關係映射),以便在您的實際查詢和所使用的對象之間創建一個分隔符。查看Propel或(我最喜歡的)Doctrine(版本2是好用)

這樣你可以有你究竟在短短相同數量的代碼想要什麼......