field

field方法屬于模型的連貫操作方法之一,主要目的是標(biāo)識要返回或者操作的字段,可以用于查詢和寫入操作。

用于查詢

指定字段

在查詢操作中field方法是使用最頻繁的。

Db::table('think_user')->field('id,title,content')->select();

這里使用field方法指定了查詢的結(jié)果集中包含id,title,content三個(gè)字段的值。執(zhí)行的SQL相當(dāng)于:

SELECT id,title,content FROM table

可以給某個(gè)字段設(shè)置別名,例如:

Db::table('think_user')->field('id,nickname as name')->select();

執(zhí)行的SQL語句相當(dāng)于:

SELECT id,nickname as name FROM table

使用SQL函數(shù)

可以在field方法中直接使用函數(shù),例如:

Db::table('think_user')->field('id,SUM(score)')->select();

執(zhí)行的SQL相當(dāng)于:

SELECT id,SUM(score) FROM table

除了select方法之外,所有的查詢方法,包括find等都可以使用field方法。

使用數(shù)組參數(shù)

field方法的參數(shù)可以支持?jǐn)?shù)組,例如:

Db::table('think_user')->field(['id','title','content'])->select();

最終執(zhí)行的SQL和前面用字符串方式是等效的。

數(shù)組方式的定義可以為某些字段定義別名,例如:

Db::table('think_user')->field(['id','nickname'=>'name'])->select();

執(zhí)行的SQL相當(dāng)于:

SELECT id,nickname as name FROM table

對于一些更復(fù)雜的字段要求,數(shù)組的優(yōu)勢則更加明顯,例如:

Db::table('think_user')->field(['id','concat(name,"-",id)'=>'truename','LEFT(title,7)'=>'sub_title'])->select();

執(zhí)行的SQL相當(dāng)于:

SELECT id,concat(name,'-',id) as truename,LEFT(title,7) as sub_title FROM table

獲取所有字段

如果有一個(gè)表有非常多的字段,需要獲取所有的字段(這個(gè)也許很簡單,因?yàn)椴徽{(diào)用field方法或者直接使用空的field方法都能做到):

Db::table('think_user')->select();
Db::table('think_user')->field('*')->select();

上面的用法是等效的,都相當(dāng)于執(zhí)行SQL:

SELECT * FROM table

但是這并不是我說的獲取所有字段,而是顯式的調(diào)用所有字段(對于對性能要求比較高的系統(tǒng),這個(gè)要求并不過分,起碼是一個(gè)比較好的習(xí)慣),下面的用法可以完成預(yù)期的作用:

Db::table('think_user')->field(true)->select();

field(true)的用法會顯式的獲取數(shù)據(jù)表的所有字段列表,哪怕你的數(shù)據(jù)表有100個(gè)字段。

字段排除

如果我希望獲取排除數(shù)據(jù)表中的content字段(文本字段的值非常耗內(nèi)存)之外的所有字段值,我們就可以使用field方法的排除功能,例如下面的方式就可以實(shí)現(xiàn)所說的功能:

Db::table('think_user')->field('content',true)->select();

則表示獲取除了content之外的所有字段,要排除更多的字段也可以:

Db::table('think_user')->field('user_id,content',true)->select();
//或者用
Db::table('think_user')->field(['user_id','content'],true)->select();

注意的是 字段排除功能不支持跨表和join操作。

用于寫入

除了查詢操作之外,field方法還有一個(gè)非常重要的安全功能--字段合法性檢測。field方法結(jié)合數(shù)據(jù)庫的寫入方法使用就可以完成表單提交的字段合法性檢測,如果我們在表單提交的處理方法中使用了:

Db::table('think_user')->field('title,email,content')->insert($data);

即表示表單中的合法字段只有title,emailcontent字段,無論用戶通過什么手段更改或者添加了瀏覽器的提交字段,都會直接屏蔽。因?yàn)?,其他是所有字段我們都不希望由用戶提交來決定,你可以通過自動完成功能定義額外的字段寫入。

在開啟數(shù)據(jù)表字段嚴(yán)格檢查的情況下,提交了非法字段會拋出異常,可以在數(shù)據(jù)庫設(shè)置文件中設(shè)置:

// 關(guān)閉嚴(yán)格字段檢查
'fields_strict'	=>	false,

V5.0.17+版本開始,系統(tǒng)還提供了fieldRaw方法,用于更安全的指定字段,尤其是使用了SQL函數(shù)的情況。

Db::table('think_user')->fieldRaw('title,email,content,max(score) as max_score')->insert($data);
文檔最后更新時(shí)間:2019-11-29 09:11:03

文檔
目錄

深色
模式

切換
寬度