【小(xiǎo)編推薦】ThinkPHP3.2——數(s→​ hù)據創建

2014-06-26   |∑¥    發布者:梁國(guó)芳©÷   | ε¶'ε  查看(kàn):332±¶ ∞0次

Thinkphp

在進行(xíng)數(shù)據操作(zuò)之<£>α前,我們往往需要(yào)手動創建需要(¥"yào)的(de)數(shù)據,例如(rú)對(duì)于提交的(d∞₹e)表單數(shù)據:

  1. // 獲取表單的(de)POST數(shù)據
  2. $data['name'] = $_POST['name'];
  3. $data['email'] = $_POST['email'];
  4. // 更多(duō)的(de)表單數(shù)據值獲取 ™♥
  5. //……

創建數(shù)據對(duì)象

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ǐ):

  1. // 實例化(huà)User模型
  2. $User = M('User');
  3. // 根據表單提交的(de)POST數(shù)據¥$創建數(shù)據對(duì)象
  4. $User->create();

Create方法支持從(cóng)其它方式創建數(shù)據對(duì)象,例☆‌如(rú),從(cóng)其它的(de)數(shù)據對(duì)Ω✔δ​象,或者數(shù)組等

  1. $data['name'] = 'ThinkPHP';
  2. $data['email'] = 'ThinkPHP@gmail.com';
  3. $User->create($data);

甚至還(hái)可(kě)以支持從(cóng)對(duìβ¥&€)象創建新的(de)數(shù)據對(duì)象

  1. // 從(cóng)User數(shù)據對(duì♦γγδ)象創建新的(de)Member數(shù)據對(duì)象
  2. $User = stdClass();
  3. $User->name = 'ThinkPHP';
  4. $User->email = 'ThinkPHP@gmail.com';
  5. $Member = M("Member");
  6. $Member->create($User);

創建完成的(de)數(shù)據可(kě)以直接讀★¶≈ (dú)取和(hé)修改,例如(rú):

  1. $data['name'] = 'ThinkPHP';
  2. $data['email'] = 'ThinkPHP@gmail.com';
  3. $User->create($data);
  4. // 創建完成數(shù)據對(duì)象後可(kě)以直接讀(dú)取數(s→•€hù)據
  5. echo $User->name;
  6. echo $User->email;
  7. // 也(yě)可(kě)以直接修改創建完成•×↔的(de)數(shù)據
  8. $User->name = 'onethink'; // 修改name字段數(shù)據
  9. $User->status = 1; // 增加新的(de)字段數(shù)據

數(shù)據操作(zuò)狀态

create方法的(de)第二個(gè)參數(shù)ε"可(kě)以指定創建數(shù)據的(de)操✔'±₩作(zuò)狀态,默認情況下(xià)是(shì)自(zì)動判斷‌€φ是(shì)寫入還(hái)是(shì)更新操作(zuò)。

也(yě)可(kě)以顯式指定操作(zuò)狀态,例如(r∑↔γú):

  1. $Member = M("User");
  2. // 指定更新數(shù)據操作(zuò)狀♠€态
  3. $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):

  1. $Member = M("User");
  2. // 指定更新數(shù)據操作(zuò‍×)狀态
  3. $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ú):

  1. $data['name'] = 'thinkphp';
  2. $data['email'] = 'thinkphp@gmail.com';
  3. $data['status'] = 1;
  4. $User = M('User');
  5. $data = $User->create($data);
  6. dump($data);

輸出結果為(wèi):

  1. array (size=3)
  2. 'name' => string 'thinkphp' (length=8)
  3. 'email' => string 'thinkphp@gmail.com' (length=18)
  4. '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ú):

  1. $User = M('User');
  2. $User->create(); //創建User數(shù)據對(duì)象
  3. $User->status = 1; // 設置默認的(de)用(yòng)戶狀态
  4. $User->create_time = time(); // 設置用(yòng)戶的(de)創建時(shí)間(jiān)
  5. $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à):

  1. // 實例化(huà)User模型
  2. $User = M('User');
  3. // 創建數(shù)據後寫入到(dào)×→§ε數(shù)據庫
  4. $data['name'] = 'ThinkPHP';
  5. $data['email'] = 'ThinkPHP@gmail.com';
  6. $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)題。

支持的(de)連貫操作(zuò)

在執行(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ú):

  1. $data['name'] = 'thinkphp';
  2. $data['email'] = 'thinkphp@gmail.com';
  3. $data['status'] = 1;
  4. $data['test'] = 'test';
  5. $User = M('User');
  6. $data = $User->field('name,email')->create($data);
  7. dump($data);

輸出結果為(wèi):

  1. array (size=2)
  2. 'name' => string 'thinkphp' (length=8)
  3. '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ú):

  1. namespace Home\Model;
  2. use Think\Model;
  3. class UserModel extends Model{
  4. protected $insertFields = 'name,email'; // 新增數(shù)據的(de)時(shí)候允許寫入name和(‌€€hé)email字段
  5. protected $updateFields = 'email'; // 編輯數(shù)據的(de)時(s✔☆σhí)候隻允許寫入email字段
  6. }