2013年12月19日 星期四

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

再貼一次上集的資料表:

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

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

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

好, 今天我們是這個平台的管理者, 而有許多店家加入這個平台, 我們這次要實作的是撈出
1. 指定的店家 (storeName)
2. 他們的點餐紀錄 (name, food, feel)

前些日子小弟我官網的資料看了又看、試了又試就是頻頻失敗 (挫折感很大),
官網把一般的AR (Active Record) 跟 RAR (Relational Active Record) 分開講, 讓我要混合運用的時候各種撞牆阿~ (一樣建議文中的連結都可以去好好了解一下, 對之後自己在思考上會蠻有幫助的)



切入重點, 為了達到我們的需求, 我使用的是yii 裡面的 CDbCriteria <-官方說明

插個話, 有人會問為什麼我提供的資料很多是中文的阿? 答案很簡單, 因為我英文爛!
我以前覺得看官方的英文說明很屌、感覺就很厲害, 不過後來想通了!

查資料不就是為了讓自己了解嗎? 如果有可以讓自己更好理解的資料管它是什麼語言都是好資料.

好, 我們繼續

這裡有更簡易的CDbCriteria說明:各種好東西分享阿

這次我直接打出Code並附上註解說明:(檔案位置是protected/controllers/StoreController.php)

$criteria=new CDbCriteria;
$criteria->select='storeName'; [註1]
$criteria->with=array( [註2]
 '_Order'=>array('select'=>[註3]
_Order.name,
_Order.food,
_Order.feel'
),
);
$criteria->compare('storeId',$id', true); [註4]
$ShowData=Store::model()->findAll($criteria); [註5]
print_r ($ShowData);

[1] select是選擇你要抓的主資料表的欄位
[2] with是選擇要使用哪個關聯, 我們選擇使用models/Store.php的_Order關聯
[3] with裡的select就是選擇你要抓的子資料表的欄位, 要用陣列形式, 所以單引號要注意
[4] compare就像SQL的where storeId=$id 當然功能不只如此 (參考1 跟 參考2), 另外, 裡面的參數true預設是false, false指的是欄位的值要完全一樣才符合 (俗稱完全匹配), true則是只要欄位裡的值有包含就算 (俗稱模糊匹配)
[5] 這是yii的查詢語法, Store是你要查詢的主資料表, findAll則是抓出所有符合的資料 (參考)


最後給大家一個yii的相關大補帖: 可以查到很多東西喔!




希望可以幫助在學習yii framework的你, 讓我們繼續加油!

沒有留言:

張貼留言