私がやろうとしているのは、製品のリストを検索して配列に格納できる「検索」クラスを作成することです。
特定の製品の詳細を取得するために使用できる「製品」クラスがすでにあります。
これが私のコードです:
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クラスが完全にバイパスされます。
「製品」がオブジェクトである場合、上記で行っているオーバーヘッドなしに「製品」オブジェクトのリストを返すことができる検索クラスを作成するための最も適切な方法は何ですか?