自(zì)動完成是(shì)ThinkPH↔¥☆P提供用(yòng)來(lái)完成數(shù)據₩αφ自(zì)動處理(lǐ)和(hé)過濾的(de)方法,使用(yòα ≤ng)create方法創建數(shù)據對(duì)象的(de)時(s₩☆€₩hí)候會(huì)自(zì)動完成數(shù)據處理(lǐ)。
因此,在ThinkPHP使用(yòng)create方法來(± lái)創建數(shù)據對(duì)象是(shì)£♦★更加安全的(de)方式,而不(bù)是(shì)直接通(tōng)過a→®♣dd或者save方法實現(xiàn)數(shù)據"™寫入。
規則定義
自(zì)動完成通(tōng)常用(yòng)來(lái)完成默認字段←¶§寫入,安全字段過濾以及業(yè)務邏輯的(de)自(zì)動處♣≠♣理(lǐ)等,和(hé)自(zì)動驗證的(de)定義方式類似,自¶φ(zì)動完成的(de)定義也(yě)支持靜(jìng)态定義和(hé)動态"δ定義兩種方式。
- 靜(jìng)态方式:在模型類裡(lǐ)面通(tōng)過$_auto屬∏Ω↑₩性定義處理(lǐ)規則。
- 動态方式:使用(yòng)模型類的(de)auto方法動★态創建自(zì)動處理(lǐ)規則。
兩種方式的(de)定義規則都(dōu)采用(yòng):↓'↔"
array(array(完成字段1,完成規則,[完成條件(jiàn),附加規則]),array(完成字段2,完成規則,[完成條件(jiàn),附加規則←♠λ]),......);
說(shuō)明(míng)
完成字段(必須)
需要(yào)進行(xíng)處理(lǐ)的(de)數(shù)據表γδ 實際字段名稱。
完成規則(必須)
需要(yào)處理(lǐ)的(de)規則,配合附加規則完成。
完成時(shí)間(jiān)(可(kě)選)
設置自(zì)動完成的(de)時(shí)間(jiān),包括:
| 設置 | 說(shuō)明(míng) |
|---|---|
| self::MODEL_INSERT或者1 | 新增數(shù)據的(de)時(shí)候處理(lǐ)(默認) |
| self::MODEL_UPDATE或者α→2 | 更新數(shù)據的(de)時(shí)候處理(lǐ↕±α) |
| self::MODEL_BOTH或者3 | 所有(yǒu)情況都(dōu)進行(xíng)處理(lǐ) |
附加規則(可(kě)選)
包括:
| 規則 | 說(shuō)明(míng) |
|---|---|
| function | 使用(yòng)函數(shù),表示填充的(de)內≥÷≥(nèi)容是(shì)一(yī)個(gè)函數§λ≥γ(shù)名 |
| callback | 回調方法 ,表示填充的(de)內(nèi)容是(shì)一(yīα↓$☆)個(gè)當前模型的(de)方法 |
| field | 用(yòng)其它字段填充,表示填充的(d>e)內(nèi)容是(shì)一(yī)個(g← è)其他(tā)字段的(de)值 |
| string | 字符串(默認方式) |
| ignore | 為(wèi)空(kōng)則忽略(3.1.2新增) |
靜(jìng)态定義
預先在模型類裡(lǐ)面定義好(hǎo)自(zì)動完成的₩©∑(de)規則,我們稱之為(wèi)靜(jìng)态定義。例✘γα如(rú),我們在模型類定義_auto屬性:
namespace Home\Model;use Think\Model;class UserModel extends Model{protected $_auto = array (array('status','1'), // 新增的(de)時(shí)候把status₽•字段設置為(wèi)1array('password','md5',3,'function') , // 對(duì)password字段在新增和(×¶hé)編輯的(de)時(shí)候使md5函數(shù)處理(lǐ) ↕∏array('name','getName',3,'callback'), // 對(duì)name字段在新增和(hé)編輯的(de)時(↔δ∞♦shí)候回調getName方法array('update_time','time',2,'function'), // 對(duì)update_time字段在更新的(de)時(≤λshí)候寫入當前時(shí)間(jiān∏♦→π)戳);}
然後,就(jiù)可(kě)以在使用(yòng)create方法創建數 Ω(shù)據對(duì)象的(de)時(s≥±✘hí)候自(zì)動處理(lǐ):
$User = D("User"); // 實例化(huà)User對(duì↕'<)象if (!$User->create()){ // 創建數(shù)據對(duì)象// 如(rú)果創建失敗 表示驗證沒有(yǒεβγu)通(tōng)過 輸出錯(cuò)誤提示信息exit($User->getError());}else{// 驗證通(tōng)過 寫入新增數(shù)據$User->add();}
如(rú)果你(nǐ)沒有(yǒu)定義σ↕β任何自(zì)動驗證規則的(de)話(huà),則不δ∑•×(bù)需要(yào)判斷create方法的(de)返回值:
$User = D("User"); // 實例化(huà)User對(duì)象$User->create(); // 生(shēng)成數(shù)據對(duì)象♣✘$User->add(); // 新增用(yòng)戶數(shù)據
或者更簡單的(de)使用(yòng):
$User = D("User"); // 實例化(huà)User對(duì)象$User->create()->add(); // 生(shēng)成數(shù)據對(duì)象并寫入數(shù)據
create方法默認情況下(xià)是(sh뮣↕ì)根據表單提交的(de)post數(shù)據生(shēng) ≤ ×成數(shù)據對(duì)象,我們也(yě)可(kě≤→∑±)以根據其他(tā)的(de)數(shù)據源來(láλ$ i)生(shēng)成數(shù)據對(duì)象,你(nǐ)也(yě σ←)可(kě)以明(míng)确指定當前創建的(de♥÷♦)數(shù)據對(duì)象自(zì)動處理(lǐ)的(de)時(s¶≈↓hí)間(jiān)是(shì)新增還(hái)是(shì)編輯±Ω₽π數(shù)據,例如(rú):
$User = D("User"); // 實例化(huà)User對(duì)象$userData = getUserData(); // 通(tōng)過方法獲取用(yòn¶Ω<≠g)戶數(shù)據$User->create($userData,2); // 根據userData數(shù)據創建數(shù)據對(duì)σ¥÷ε象,并指定為(wèi)更新數(shù)據$User->add();
create方法的(de)第二個(gè)參數(shù)就(jiù)用(yò'÷ng)于指定自(zì)動完成規則中的(de)完成♦♠™σ時(shí)間(jiān),也(yě)就(jiù)是(shβ♣∞✔ì)說(shuō)create方法的(de)自(zì)動處理(lǐ)規則隻γ✔λ會(huì)處理(lǐ)符合完成時(shí)間(jiān)的(de)自(z왩₽)動完成規則。 create方法在創建數(shù)據的(de)時(shíε©)候,已經自(zì)動過濾了(le)非數(shù)據表字段數(shù)據> 信息,因此不(bù)需要(yào)擔心表單會(huì)提交其他≠≠(tā)的(de)非法字段信息而導緻數(shù)據對(duì)象寫入出§©€錯(cuò),甚至還(hái)可(kě)以自(zì♣©)動過濾不(bù)希望用(yòng)戶在表單提交的(d★©€e)字段信息(詳見(jiàn)字段合法性過濾)。
3.1.2版本開(kāi)始新增了(le)ignore完成規則,這(zhè)一←♠₹π(yī)規則表示某個(gè)字段如(rú)果留空(kōng)的(de)話(hu¶>♦₩à)則忽略,通(tōng)常可(kě)用(yòng)于修改用(yòn£≠₹g)戶資料時(shí)候密碼的(de)輸入,定義如(r•βα∏ú)下(xià):
array('password','',2,'ignore')
表示password字段編輯的(de)時(shí÷∞©)候留空(kōng)則忽略。
動态完成
除了(le)靜(jìng)态定義之外(wài),我們也(y✘ ě)可(kě)以采用(yòng)動态完成的(de)方式來(lái±≤)解決不(bù)同的(de)處理(lǐ)規則。
$rules = array (array('status','1'), // 新增的(de)時(shí)候把status字>÷段設置為(wèi)1array('password','md5',3,'function') , // 對(duì)password字段在新增☆β₽♥和(hé)編輯的(de)時(shí)候使md5函數(s"←hù)處理(lǐ)array('update_time','time',2,'function'), // 對(duì)update_time字段在更新的(de)時(shí∑£)候寫入當前時(shí)間(jiān)戳);$User = M('User');$User->auto($rules)->create()->add();
修改數(shù)據對(duì)象
在使用(yòng)create方法創建好(hǎo)數(shù)據對(d≤λuì)象之後,此時(shí)的(de)數(shù)據對₽÷'(duì)象保存在內(nèi)存中,因此仍然€α可(kě)以操作(zuò)數(shù)據對(duì)§∑↕象,包括修改或者增加數(shù)據對(duì)象的(de)值,例如(rú&✘×):
$User = D("User"); // 實例化(huà)User對(duì)象$User->create(); // 生(shēng)成數(shù)據對(→♦ duì)象$User->status = 2; // 修改數(shù)據對(duì)象的(de)statγ ☆♣us屬性$User->register_time = NOW_TIME; // 增加register_time屬性$User->add(); // 新增用(yòng)戶數(shù)據
一(yī)旦調用(yòng)了(le)add方法(或者sa£♣ve方法),創建在內(nèi)存中的(de)數(shù) ✘&'據對(duì)象就(jiù)會(huì)失★∞效,如(rú)果希望創建好(hǎo)的(≠∑de)數(shù)據對(duì)象在後面的(de)數(s✘hù)據處理(lǐ)中再次調用(yòng),可(kě)以 ©÷↓保存數(shù)據對(duì)象先,例如(rú):
$User = D("User"); // 實例化(huà)User對(duì)象$data = $User->create(); // 保存生(shēng)成的(de)數(shù)據對(duì)象$User->add();
不(bù)過要(yào)記得(de),如(rú)果你(nǐ'♠♦)修改了(le)內(nèi)存中的(de)數(shù)據對(↔&duì)象并不(bù)會(huì)自(zì)動更新保存的(de)數(shù)據 δε 對(duì)象,因此下(xià)面的(de)用(yò←∞ng)法是(shì)錯(cuò)誤的(de):
$User = D("User"); // 實例化(huà)User對(duì)象$data = $User->create(); // 保存生(shēng)成的(de)數(shù)據對(duì)象$User->status = 2; // 修改數(shù)據對(duì)象的(de)status屬性$User->register_time = NOW_TIME; // 增加register_time屬性$User->add($data);
上(shàng)面的(de)代碼我們修改了(le)數(β≤λshù)據對(duì)象,但(dàn)是(shì≈φ )仍然寫入的(de)是(shì)之前保存的(dε&e)數(shù)據對(duì)象,因此對(duì)數(shù)據對(® duì)象的(de)更改操作(zuò)将會(huì♣Ω∞)無效。




