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
,email
和content
字段,無論用戶通過什么手段更改或者添加了瀏覽器的提交字段,都會直接屏蔽。因?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);