引言
數據庫操作是應用程序不可避免的絕大多數。難怪有些老程序員總是略帶自嘲地說,“不就是個 curd 嘛,說的那么高深!”
的確,往簡單了說,編程不過是增刪改查數據庫。高級程序員,不過是增刪改查地高級一些。
可見這是硬功夫,必須深刻掌握。今天,我們就從一個復雜一些的嵌套式查詢說起。
學習時間
對于數據庫DBA可能更習慣從SQL的角度出發,從SQL現有的語言結構和功能上解決問題。比如查詢一個product表,要求查詢條件中,product_catagory 表的某些字段存在才能才回。
寫多了容易無解,直接上SQL:
大家注意那個 IN 子句,其實是一個查詢結果集,從另個表返回的。
寫SQL真的很傷神,不如用框架自帶的orm,操作起來非常人性化,拼裝也很簡單。那就拋出一個問題,Laravel如何實現上述的子查詢?
對Laravel來說,簡直不要太簡單,你只要在寫whereIn的時候,將數組使用閉包返回就可以了。代碼像這么寫:
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,用于包裹返回值數據,那么直接用閉包就是。
$query->select('paper_type_id')->from(TABLE_NAME)->whereIn('category_id', ['223', '15'])->where('active', 1);
也是極為尋常的一條語句。注意from就是表名。我們可以使用方法將其返回,注意是字符串類型:
with(new ProductCategory)->getTable()
這一句要求你的 Products 模型內定義了關聯模型,上一句不過是獲取 product_catagory 這個表名的字符串。
不止一個方法
解決問題的方法永遠不止一個,在Laravel中你還可以不像上一節那樣,雖然很明確,寫的很標準,可是并不是所有開發者都能達到那樣的熟練度。
我們說說通用的,一般開發者所能想到的一些方法。比如獲取關聯表名那一段,改為手動指定表名,指定列名:
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語句了。比較直觀。缺點是,不能復用,冗余代碼多到令人發指。
寫在最后
本文通過一個SQL語句查詢在Laravel中的實現方式,解釋了laravel在拼裝SQL查詢時的自由度,使用起來非常靈活。
對于固定的查詢方式,或者經過優化的SQL語句,你大可直接發送給Laravel直接運行以便提高效率。
HAppy coding :-)
我是 @程序員小助手 ,持續分享編程知識,歡迎關注。