Model 用法:
Model是負責跟資料庫溝通用的,一個資料表會對應到一個model程式,
通常我們也會在這邊定義好資料庫中,資料表(model)與資料表(model)的關係。
Model的程式是要放在app/models裏面,要繼承AppModel (ex: class Album extends AppModel)。
Model的基本要素:
$name:和controller的$name相同,是用來告訴CakePHP這個model的名稱。
$primaryKey:是指這個model對應到的資料表中的primary key欄位名稱,
如果沒設定的話,CakePHP會預成”id”。
$useTable:是指這個model對應到的資料表名稱。CakePHP有自己一套對應的規則,
不過我們就直接指定給它比較清楚,日後維護也比較方便。
Model如何處理資料:
最簡單的方式,參照CakePHP手冊上的做法,在網頁裏面中,form的變數名稱取成”data[model_name][column_name]”的方式,這個可以透過$html這個helper來達成,
你會看到在某些view裏面,會有$html->input等的程式,就是在做這項工作。
當資料從網頁傳到controller時,controller會包裝這些資料到$data這個array中,
所以你會在controller裏面,常常看到$this->data。
資料儲存或更新至資料庫時,可以用model的save來達成,但是要注意的是,
如果沒有指定model中primaryKey的值時,model會當作是要做insert的動作,
如果有指定primaryKey的值時,則是做update。在controller的程式碼中,
ex:$this->Album->id = 1;$this->Album->save($this->data);
這個會對資料表中,primaryKey值為1的資料,做修改。
__contruct():在Model的__contruct()中,我們直接指定了Model各欄位的定義,
我們會這麼做的原因是,CakePHP在使用Model時,都會先對資料庫執行describe的指令,
來取得該資料表的欄位定義,因此我們先直接指定給Model,省去CakePHP做這樣子的動作。
資料的確認:
在Model中,我們有設定$validate這個array,主要是要告訴Model,那些欄位的值,
是必須符合那些條件,比如說:不能是空白字串,或者有限定的長度等等,
這些條件是用regular expression來做的。
至於CakePHP有內建了那些規則,可以看/home/photo/cake/libs/ validators.php。
Model的關連性(Association):
通常資料表間,它們都會有關係,像我們的photo中,member和album就有關係,
每個會員,都會有好幾個相簿,而每個相簿都只被一位會員擁有。
CakePHP定義了四種關係,其實我們大部分也都只會用到這四種關係:
$hasOne:在CakePHP中Model的說明裏,它舉例說明每位使用者,都會有一份個人資料,
所以在它範例中User這個model裏,設定了$hasOne,關連到Profile這個model。
$hasMany:在我們的Photo中,每位會員可有擁有好幾本相簿,所以member這個model (/home/photo/app/models/member.php),定義了$hasMany關連到Album這個model。
$belongsTo:因為每本相簿只會屬於某一位會員,在Album這個model中,我們定義了$belongsTo關連到Member。
$hasAndBelongsToMany:最常見的例子是分類,比如說:一篇文章會有好幾個分類,而一個分類也會有好幾篇文章歸在裏面。通常的做法,我們會有一個文章的資料表,一個分類的資料表,再加一個文章和分類的對應資料表,而$hasAndBelongsToMany,就是在定義這樣子的關係。
至於關連的資料的取得控制,是用model中$recursive來控制的,如果不想要取得像$hasMany關連的資料,那就把$recursive設定成0。如果你的關連資料是有好幾層:比如:一位會員有好幾本相簿,一本相簿有好幾張相片,對會員這個model來說,相片的model是屬於第二層,如果要用member這個model來取得這個會員有那些相片時,就要把$recursive設定成2。
用Association的好處是,在我們查詢或刪除資料的時候,model會依據我們的設定來幫我們取得我們要的資料,不用像以前我們要自己寫好幾行的查詢SQL才能做到。在當我們刪除某筆資料時,他也會依照我們的設定,把相關連的資料一併刪除。
沒有留言:
張貼留言