假設我有一個數據庫架構這樣的功能:編寫用於SQL結果行轉換爲對象
http://img98.imageshack.us/img98/786/samplequ.png
我用下面的SQL從客戶表中選擇所有行,也所有相關行:
SELECT c.*,
cty.id AS country__id, cty.name AS country__name,
o.id AS order__id, o.date AS order__date, o.total AS order__total,
ol.id AS order__orderline__id, ol.quantity AS order__orderline__quantity, ol.sub_total AS order__orderline__sub_total,
p.id AS order__orderline__product__id, p.name AS order__orderline__product__name, p.price AS order__orderline__product__price,
s.id AS order__shop__id, s.name AS order__shop__name
FROM customer c
JOIN country cty ON cty.id=c.country_id
JOIN order o ON o.customer_id=c.id
JOIN shop s ON s.id=o.shop_id
JOIN orderline ol ON ol.order_id=o.id
JOIN product p ON ol.product_id=p.id
ORDER BY
c.last_name ASC,
c.first_name ASC,
o.date DESC,
ol.id ASC
你可以看到,儘管從客戶表中的列,所有其他列使用,反映了它的別名可用於構建對象的關係。別名中的雙下劃線用於標識關係層次結構。
我想編寫一個PHP函數,它接受結果行並返回一個數組Customer對象。這些客戶對象應加載與其他相關對象:
$customers=convert_result_rows_to_objects($result_rows,'Customer');
foreach($customers as $cust){
echo $cust->id;
echo $cust->get_full_name();
echo $cust->country->name;
foreach($cust->orders as $o){
echo $o->id;
echo $o->date;
echo $o->shop->name;
foreach($o->orderlines as $ol){
echo $ol->product->name
echo $ol->quantity;
echo $ol->sub_total;
}
echo $o->total;
}
}
我已經寫爲每個數據庫表的模型,例如:
class Customer{
public function get_full_name(){...}
}
爲了簡單起見,我忽略了getter和setter適用於所有其他領域。
但我該怎麼寫convert_result_rows_to_objects函數?
我不想使用ORM。
我在我的大腦已經搞到現在,函數應該是這樣的,
function convert_result_rows_to_objects($result_rows, $main_class_name){
$main_objs = array(); //containing the main objects to be returned, customer objects in my example
$main_obj = NULL;
$previous_row = NULL;
$next_row = NULL;
for($i = 0; $i<count($result_rows); $i++){
$previous_row = ($i > 0 ? ($result_rows[$i - 1]) : NULL);
$this_row = $result_rows[$i];
$next_row = $i === (count($result_rows) - 1) ? NULL : ($result_rows[$i + 1]);
if ($previous_row === NULL || $previous_row->id !== $this_row->id) {
$main_obj = new $main_class_name(); //create the main object
//what should be done next?
}
}
我可以,但我想寫一個泛型函數,可以在大多數情況下使用。 – bobo
您想要一個通用函數,但您的查詢不是通用的。那麼有什麼意義呢? – fromvega
看來你確實需要一個ORM – fromvega