我想做的是编写一个“搜索”类,它可以搜索产品列表并将它们存储在一个数组中。
我已经有一个“产品”类,可用于获取特定产品的详细信息。
这是我的代码:
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 个匹配的产品,将在 Product 类中执行 100 个单独的查询。
但是,如果我使用单个查询直接在 doSearch 方法中获取产品,那么这将完全绕过 Product 类。
当“产品”是一个对象时,编写一个可以返回“产品”对象列表的搜索类最合适的方法是什么,而不会产生我上面所做的开销?