2013年12月18日 星期三

yii framework - 怎樣才能一次搜尋就抓兩張資料表的欄位? (逐步教學) [上]

假設有order、store兩張表, 欄位如下

order (客人點餐紀錄)
storeId, name, food, feel

store (店家資料)
storeId, storeName, storeAdd, storePhone

他們之間的關係是
一個店家會有多筆點餐紀錄 <- 搞清楚關係是很重要的唷

這時候我們已經知道要有哪個資料表要有那些欄位了, 也知道他們之間的關係了
接著我們就要建立起他們之間的關係-relations, relations這個關鍵字很重要

接著我們參考一下官方的說明: 如何建立資料表之間的關聯?

(強烈建議好好看過官方的說明再使用等一下我說的快速方法)



先複習一下yii的關聯語法:

BELONGS_TO(屬於): 如果表A 和B 之間的關係是一對多,則表B 屬於表A
HAS_MANY(有多個): 如果表A 和B 之間的關係是一對多,則A 有多個B
HAS_ONE(有一個): 這是HAS_MANY 的一個特例,A 最多有一個B
MANY_MANY: 這個對應於數據庫中的多對多關係。由於多數DBMS 不直接支持多對多關係,因此需要有一個關聯表將多對多關係分割為一對多關係。

需要休息一下嗎?

重點來了, 切入重點 (自己打這些code都昏頭了吧! 觀念清楚最重要, 觀念清楚後實作選擇更有效率的開發方式我覺得才是對的), 快速方法如下:

1. 使用phpMyAdmin重新設計Schema (不知道這個單字的可以查一下, 我當初還真不知道呢)、建立正確的資料表間的關聯 (感謝這篇)

2. 使用yii的Gii建立你需要的model (如何使用Gii?)

建立完後你點開Gii產生的model檔案(假設我點開protected/models/Store.php), 你會發現裡面有這句:

public function relations()
{
// NOTE: you may need to adjust the relation name and the related
// class name for the relations automatically generated below.
return array(
'_Order' => array(self::HAS_MANY, 'Order', 'storeId'),
);
}

然後你會在protected/models/Order.php發現這句:

'_Store' => array(self::BELONGS_TO, 'Store', 'storeId')

PS:'_Order' 跟 '_Store' <- 這些關聯的名稱是我後來命名的, 自動產生的不是這樣.

是不是超方便的阿!所以說

"資料庫的關聯本身如果做好的話,Yii會在生成的model代碼裡直接設定好relations,這在開發將節省很多時間.所以在使用Gii之前思考好個資料表間的關係將有利於開發的速度"


到這邊我們已經建立好資料庫跟相關的Model了, 下一步我們就可以開始寫Controller的action了!

先到這邊, 明天還要上早班呢, 明天會補下集給大家.




沒有留言:

張貼留言