引言
數(shù)據(jù)庫操作是應(yīng)用程序不可避免的絕大多數(shù)。難怪有些老程序員總是略帶自嘲地說,“不就是個 curd 嘛,說的那么高深!”

的確,往簡單了說,編程不過是增刪改查數(shù)據(jù)庫。高級程序員,不過是增刪改查地高級一些。
可見這是硬功夫,必須深刻掌握。今天,我們就從一個復(fù)雜一些的嵌套式查詢說起。
學(xué)習(xí)時間
對于數(shù)據(jù)庫DBA可能更習(xí)慣從SQL的角度出發(fā),從SQL現(xiàn)有的語言結(jié)構(gòu)和功能上解決問題。比如查詢一個product表,要求查詢條件中,product_catagory 表的某些字段存在才能才回。
寫多了容易無解,直接上SQL:

大家注意那個 IN 子句,其實是一個查詢結(jié)果集,從另個表返回的。
寫SQL真的很傷神,不如用框架自帶的orm,操作起來非常人性化,拼裝也很簡單。那就拋出一個問題,Laravel如何實現(xiàn)上述的子查詢?
對Laravel來說,簡直不要太簡單,你只要在寫whereIn的時候,將數(shù)組使用閉包返回就可以了。代碼像這么寫:
Products::whereIn('id', function($query){
$query->select('paper_type_id')
->from(with(new ProductCategory)->getTable())
->whereIn('category_id', ['223', '15'])
->where('active', 1);
})->get();
注意外層是
Products::whereIn('id', array(...))->get();
然后我們需要定制的 array,用于包裹返回值數(shù)據(jù),那么直接用閉包就是。
$query->select('paper_type_id')->from(TABLE_NAME)->whereIn('category_id', ['223', '15'])->where('active', 1);
也是極為尋常的一條語句。注意from就是表名。我們可以使用方法將其返回,注意是字符串類型:
with(new ProductCategory)->getTable()
這一句要求你的 Products 模型內(nèi)定義了關(guān)聯(lián)模型,上一句不過是獲取 product_catagory 這個表名的字符串。
不止一個方法
解決問題的方法永遠(yuǎn)不止一個,在Laravel中你還可以不像上一節(jié)那樣,雖然很明確,寫的很標(biāo)準(zhǔn),可是并不是所有開發(fā)者都能達(dá)到那樣的熟練度。
我們說說通用的,一般開發(fā)者所能想到的一些方法。比如獲取關(guān)聯(lián)表名那一段,改為手動指定表名,指定列名:
DB::table('users')
->whereIn('id', function($query)
{
$query->select(DB::raw('paper_type_id as blablabla'))
->from('product_catagory')
->whereIn('id', array(...))
->where('active', 1);
})
->get();
這樣使用 DB::raw,還有 whereRaw 方法,你幾乎就是在寫原生的SQL語句了。比較直觀。缺點是,不能復(fù)用,冗余代碼多到令人發(fā)指。
寫在最后
本文通過一個SQL語句查詢在Laravel中的實現(xiàn)方式,解釋了laravel在拼裝SQL查詢時的自由度,使用起來非常靈活。
對于固定的查詢方式,或者經(jīng)過優(yōu)化的SQL語句,你大可直接發(fā)送給Laravel直接運行以便提高效率。
HAppy coding :-)
我是 @程序員小助手 ,持續(xù)分享編程知識,歡迎關(guān)注。