2012-11-24 32 views
1

我想要做的是編寫一個「搜索」類,它可以搜索產品列表並將它們存儲在一個數組中。類從另一個類創建對象,但具有較少的開銷

我已經有一個「產品」類,可用於獲取特定產品的詳細信息。

這裏是我的代碼:

class Product { 

    public $name; 
    public $price; 
    public $description; 

    public function getProductById ($id) { 

     $sql = 'SELECT name, price, description FROM product WHERE id = ' . $id; 

     $row = /* MySQL functions here to execute SQL statement and get a matching row */ 

     $this->name = $row['name']; 
     $this->price = $row['price']; 
     $this->description = $row['description']; 
     return TRUE; 
    } 
} 

class Search { 

    public $results; 
    public $totalResults; 

    function __construct() { 
     $this->results = array(); 
     $this->totalResults = 0; 
    } 

    public function doSearch ($name) { 

     $sql = 'SELECT id FROM product WHERE name LIKE "%' . $name . '%"'; 

     $rows = /* MySQL functions here to execute SQL statement and get a list of matching product ID's */ 

     foreach ($rows as $row) { 
      $product = new Product; 
      $product->getProductById ($row['productid']); 
      $this->results[] = $product; 
     } 
     return TRUE; 
    } 
} 

$search = new Search; 
$search->doSearch ('Fresh Flowers'); 

的問題與上面的是,在doSearch方法所有匹配的記錄將在getProductById方法執行查詢。如果有100個匹配的產品,則會在產品類中執行100個單獨的查詢。

但是,如果我使用單個查詢直接在doSearch方法中獲取產品,則會完全繞過Product類。

當一個「產品」是一個對象時,編寫一個可以返回「產品」對象列表的搜索類的最合適的方式是什麼,而不需要我在上面做什麼的開銷?

+0

上什麼'join'在SQL讀了。 – goat

+0

@rambocoder JOIN在這裏幾乎沒有用處。 – phant0m

+0

哦,我沒有注意到兩個查詢中都使用了同一張表。 – goat

回答

1

Product類添加一個構造函數,該類使用名稱,價格和描述作爲參數(或聯合數組),以使用必要的值填充對象,解耦數據庫查詢。

doSearch,您可以創建一個SELECT不僅得到了ID,但是從產品表中的所有相關領域,並創建填充了產品與new Product($name, $price, $description)new Product($row)立即對象,無需調用getProductById每個產品。

0

創建一個類,使用數據庫中的數據填充Product的實例。

然後,類可以創建Product類的一個或多個實例,具體取決於要提取多少數據。

結論:從Product類中提取getProductById並將其放在其他位置。它是一種專門的方法,只填充一個實例。

0

只要抓住你想要的東西。

public function doSearch ($name) { 

     $sql = 'SELECT id, name, price, description FROM product 
      WHERE name LIKE "%' . $name . '%"'; 

// now just return the array  

} 

或者使用PDO將結果集作爲對象返回。

$result->setFetchMode(PDO::FETCH_INTO, new animals); 

這裏討論:How can I simply return objects in PDO?

0

您的產品類不應該知道一個數據庫什麼。它應該包含表示產品的值,僅此而已。從這個類中提取處理數據庫的所有東西。

搜索產品是訪問產品列表的一種方式。然後你的下一個班級應該是產品清單。只有在訪問單個產品時,您不必處理列表,但這可能比您想象的要少。

好吧,你有產品和產品列表,你現在可以前進一步,並添加數據庫訪問。你需要一個類來處理給你一個產品(當通過id進行搜索時)和產品列表(當通過一些文本或其他東西進行搜索時)。只有這個類允許你處理訪問數據庫所需的查詢。每個查詢的結果集可能直接在「產品列表」類中使用,可能是繼承了通用「產品列表」類中定義的所有內容,並添加了處理數據庫結果的內容。

所以最後你會最終有:

Product -> ListOfProducts -> ProductDatabase -> DatabaseAccessLayer

+0

我將Wolfgang Stengel的答案標記爲正確答案,因爲它給出了給出的例子的最直接答案。我嘗試了你的建議,並且無法理解我的想法,但這可能低於我的專業水平。我看到你來自哪裏,並希望進一步試驗你的想法。 – MrCarrot

相關問題