
2014-06-26 |∑¥ 發布者:梁國(guó)芳©÷ | ε¶'ε 查看(kàn):332±¶ ∞0次
Thinkphp在進行(xíng)數(shù)據操作(zuò)之<£>α前,我們往往需要(yào)手動創建需要(¥"yào)的(de)數(shù)據,例如(rú)對(duì)于提交的(d∞₹e)表單數(shù)據:
// 獲取表單的(de)POST數(shù)據$data['name'] = $_POST['name'];$data['email'] = $_POST['email'];// 更多(duō)的(de)表單數(shù)據值獲取 ™♥//……
ThinkPHP可(kě)以幫助你(nǐα£☆)快(kuài)速地(dì)創建數(shù)據對β♠→δ(duì)象,最典型的(de)應用(yòng)就(jiù)是(shì)自★∑"$(zì)動根據表單數(shù)據創建數(shù)據對(duì)₽象,這(zhè)個(gè)優勢在一(yī)>↕個(gè)數(shù)據表的(de)字段非<×常之多(duō)的(de)情況下(xià)尤其明(mín€¶g)顯。
很(hěn)簡單的(de)例子(zǐ):
// 實例化(huà)User模型$User = M('User');// 根據表單提交的(de)POST數(shù)據¥$創建數(shù)據對(duì)象$User->create();
Create方法支持從(cóng)其它方式創建數(shù)據對(duì)象,例☆如(rú),從(cóng)其它的(de)數(shù)據對(duì)Ω✔δ象,或者數(shù)組等
$data['name'] = 'ThinkPHP';$data['email'] = 'ThinkPHP@gmail.com';$User->create($data);
甚至還(hái)可(kě)以支持從(cóng)對(duìβ¥&€)象創建新的(de)數(shù)據對(duì)象
// 從(cóng)User數(shù)據對(duì♦γγδ)象創建新的(de)Member數(shù)據對(duì)象$User = stdClass();$User->name = 'ThinkPHP';$User->email = 'ThinkPHP@gmail.com';$Member = M("Member");$Member->create($User);
創建完成的(de)數(shù)據可(kě)以直接讀★¶≈ (dú)取和(hé)修改,例如(rú):
$data['name'] = 'ThinkPHP';$data['email'] = 'ThinkPHP@gmail.com';$User->create($data);// 創建完成數(shù)據對(duì)象後可(kě)以直接讀(dú)取數(s→•€hù)據echo $User->name;echo $User->email;// 也(yě)可(kě)以直接修改創建完成•×↔的(de)數(shù)據$User->name = 'onethink'; // 修改name字段數(shù)據$User->status = 1; // 增加新的(de)字段數(shù)據
create方法的(de)第二個(gè)參數(shù)ε"可(kě)以指定創建數(shù)據的(de)操✔'±₩作(zuò)狀态,默認情況下(xià)是(shì)自(zì)動判斷€φ是(shì)寫入還(hái)是(shì)更新操作(zuò)。
也(yě)可(kě)以顯式指定操作(zuò)狀态,例如(r∑↔γú):
$Member = M("User");// 指定更新數(shù)據操作(zuò)狀♠€态$Member->create($_POST,Model::MODEL_UPDATE);
系統內(nèi)置的(de)數(shù)據操作(zuò)包γ>♥<括Model::MODEL_INSERT(或者1)和(hé)Model::MODEL_UPDATE(或者2),當沒有(yǒu)指定的(de)時(★'πshí)候,系統根據數(shù)據源是(shì)否包含主鍵數(shù)™♥ 據來(lái)自(zì)動判斷,如(rú)果存在主鍵數(sσ→hù)據,就(jiù)當成Model::MODEL_UPDATE操作(zuò)。
不(bù)同的(de)數(shù)據操作σ∑♥(zuò)狀态可(kě)以定義不(bù)同的(de≤¥₽β)數(shù)據驗證和(hé)自(zì)動完成機(jī)制(zhì),所以≈σ★,你(nǐ)可(kě)以自(zì)定義自(zì)己需要(yào)的 $∏β(de)數(shù)據操作(zuò)狀态,例如(rú),可(kě)• &×以設置登錄操作(zuò)的(de)數(shù)據狀态(假£β設為(wèi)3):
$Member = M("User");// 指定更新數(shù)據操作(zuò×)狀态$Member->create($_POST,3);
事(shì)實上(shàng),creat≠$λ®e方法所做(zuò)的(de)工(gōng)作(zuò×'™)遠(yuǎn)非這(zhè)麽簡單,在創✘•©π建數(shù)據對(duì)象的(de)同時(shí),完成了✔ ™(le)一(yī)系列的(de)工(gōng)作(zγuò),我們來(lái)看(kàn)下(x>☆'ià)create方法的(de)工(gōn↓<♥g)作(zuò)流程就(jiù)能(nén φg)明(míng)白(bái):
| 步驟 | 說(shuō)明(míng) | 返回 |
|---|---|---|
| 1 | 獲取數(shù)據源(默認是(shì)POST數(shù)組) | |
| 2 | 驗證數(shù)據源合法性(非數(shù)組或者對(duγλγ☆ì)象會(huì)過濾) | 失敗則返回false |
| 3 | 檢查字段映射 | |
| 4 | 判斷數(shù)據狀态(新增或者編輯,指定或者自(z ≥ì)動判斷) | |
| 5 | 數(shù)據自(zì)動驗證 | 失敗則返回false |
| 6 | 表單令牌驗證 | 失敗則返回false |
| 7 | 表單數(shù)據賦值(過濾非法字段和(hé)字符串處理(lǐ≤₩©♣)) | |
| 8 | 數(shù)據自(zì)動完成 | |
| 9 | 生(shēng)成數(shù)據對(duì)象(保↑σ存在內(nèi)存) |
因此,我們熟悉的(de)令牌驗證、自(zì₩≥)動驗證和(hé)自(zì)動完成功能(né ng),其實都(dōu)必須通(tōng)過creat€ e方法才能(néng)生(shēng)效。
如(rú)果沒有(yǒu)定義自(zì)動驗證§$的(de)話(huà),create方法的(de)返回值' 是(shì)創建完成的(de)數(shù)據對(duì)象數(shù)組,例φ"¥如(rú):
$data['name'] = 'thinkphp';$data['email'] = 'thinkphp@gmail.com';$data['status'] = 1;$User = M('User');$data = $User->create($data);dump($data);
輸出結果為(wèi):
array (size=3)'name' => string 'thinkphp' (length=8)'email' => string 'thinkphp@gmail.com' (length=18)'status'=> int 1
Create方法創建的(de)數(shù)據對✔ ₩(duì)象是(shì)保存在內(nèi)存中,并©↔ 沒有(yǒu)實際寫入到(dào)數(shù)據庫中,直到(← $dào)使用(yòng)add或者save方法才會(huì)真正寫入數(shù)據庫。
因此在沒有(yǒu)調用(yòng)add或者save方法之前,我們都(dōu≤ε)可(kě)以改變create方法創建的(d$✔®×e)數(shù)據對(duì)象,例如(rú):
$User = M('User');$User->create(); //創建User數(shù)據對(duì)象$User->status = 1; // 設置默認的(de)用(yòng)戶狀态$User->create_time = time(); // 設置用(yòng)戶的(de)創建時(shí)間(jiān)$User->add(); // 把用(yòng)戶對(duì)象寫入數(shù)據庫
如(rú)果隻是(shì)想簡單創建一(yī)個(gè)數(s ↑∏∑hù)據對(duì)象,并不(bù)需要(yào)完成±§✘一(yī)些(xiē)額外(wài)的(de)功能(₹∞•néng)的(de)話(huà),可(kě)以使用(yòng)dat✔↓"a方法簡單的(de)創建數(shù)據對(duì)象。 使用(yò↔↓ng)如(rú)下(xià):
// 實例化(huà)User模型$User = M('User');// 創建數(shù)據後寫入到(dào)×→§ε數(shù)據庫$data['name'] = 'ThinkPHP';$data['email'] = 'ThinkPHP@gmail.com';$User->data($data)->add();
Data方法也(yě)支持傳入數(shù)組和(hé)對( ₽duì)象,使用(yòng)data方法創建的(de)數↑®∑(shù)據對(duì)象不(bù)會(huì)進行(xíng ↕ )自(zì)動驗證和(hé)過濾操作(zuò),請(qǐng)自(zì)行λ<♥(xíng)處理(lǐ)。但(dàn)在•¶進行(xíng)add或者save操作(zuò)•λ的(de)時(shí) 候,數(shù)據表中不(bù)存在的(de)¶₹字段以及非法的(de)數(shù)據類型(例如(rú)₩≈÷對(duì)象、數(shù)組等非标量數(shù)據)是(ε←shì)會(huì)自(zì)動過濾的(de),不(bù)用₩&(yòng)擔心非數(shù)據表字段的α'(de)寫入導緻SQL錯(cuò)誤的(♥₽✘de)問(wèn)題。
在執行(xíng)create方法之前,我們可(kě)以調用(yòng)相(xiàng)關的(de)連貫操作(zuò)方法,配合完成數(shù)據創≈±建操作(zuò)。
create方法支持的(de)連貫操作(zuò)方法包括:
| 連貫操作(zuò) | 作(zuò)用(yòng) | 支持的(de)參數(shù)類型 |
|---|---|---|
| field | 用(yòng)于定義合法的(de)字段 | 字符串和(hé)數(shù)組 |
| validate | 用(yòng)于數(shù)據自(zì)動驗證 | 數(shù)組 |
| auto | 用(yòng)于數(shù)據自(zì)動完成 | 數(shù)組 |
| token | 用(yòng)于令牌驗證 | 布爾值 |
更多(duō)的(de)用(yòng)法參考後續的(de)內(nèi$ ♣™)容。
如(rú)果在create方法之前調用(yòng)fi♣≈eld方法,則表示隻允許創建指定的(de)字段數(shù)據,其他(t↔♥ā)非法字段将會(huì)被過濾,例如(rú):
$data['name'] = 'thinkphp';$data['email'] = 'thinkphp@gmail.com';$data['status'] = 1;$data['test'] = 'test';$User = M('User');$data = $User->field('name,email')->create($data);dump($data);
輸出結果為(wèi):
array (size=2)'name' => string 'thinkphp' (length=8)'email' => string 'thinkphp@gmail.com' (length=18)
最終隻有(yǒu)name和(hé)email字段的(de)數(shù)據被允許寫入,↕'♦>status和(hé)test字段直接被過濾了(le),哪怕status也±€(yě)是(shì)數(shù)據表中的(de)合法字段。
如(rú)果我們有(yǒu)自(zì)定義模型類,對( ™∑♠duì)于數(shù)據新增和(hé)編輯操作(zuò)€↕±≤的(de)話(huà),我們還(hái)可≥φ(kě)以直接在模型類裡(lǐ)面通(tōn×↕g)過設置insertFields和(hé)updateFields屬性來(lái)定義允許的(de)字段,例如"≈(rú):
namespace Home\Model;use Think\Model;class UserModel extends Model{protected $insertFields = 'name,email'; // 新增數(shù)據的(de)時(shí)候允許寫入name和(€€hé)email字段protected $updateFields = 'email'; // 編輯數(shù)據的(de)時(s✔☆σhí)候隻允許寫入email字段}
