小白由於常常用到多表查詢,好比獲取一個會員領取的卡卷list,裏面固然包含了1「會員優惠券記錄表t_coupon_members」主表,而後2「門店優惠券表t_coupon」,和3「門店信息表t_shop」。連表關係是:主表1裏的冗餘字段門店優惠券coupon_id對應表2,而後表2的冗餘字段shop_id對應表3的店鋪id。因此直接3表聯查便可獲取,可是被告知須要優化,下面是優化結果。php
1、如何優化數據庫
一、這邊優化是,直接主表1和主表2聯查獲取到一個帶有門店id的二維數組$list,而後經過門店id進行數據庫IN語句查詢出知足條件的門店信息$shop_info,而後循環$list,經過PHP數組處理函數array_column,將$shop_info匹配到$list中。以下是具體實現步驟,代碼框架TP5.1。數組
2、具體步驟框架
一、連表獲取表1和表2的數組函數
$list = $this->alias('M1') ->field('M1.id,M1.status,M1.member_id,M1.writer_time, M2.coupon_name,M2.shop_id,M2.type,M2.type_value1,M2.type_value2,M2.use_start_time,M2.use_end_time ') ->join('t_coupon M2','M1.coupon_id = M2.id','left') ->where($where) ->page($page + 1,$psize) ->select(); $list ? $list = $list->toArray() : [];
二、結果以下圖2,這裏要注意,爲何要用 ->toArray(),由於在TP5.1裏面 ->select() 查詢返回的是一個對象,有人可能說我用 dump() ,打印顯示的是一個數組呀,這個我也是用 數組函數 array_column,報錯提示參數必須是一個數組,才發現。原來 dump() 是TP5.1對它進行了封裝,你們能夠用PHP自帶的 var_dump() 打印一下就明白了,如圖1。優化
三、拿到帶有門店的shop_id後,咱們再對它進行數組處理,獲取一個IN語句使用數組,相似【4,5】這樣的,代碼以下:this
$shop_id = array_column($list,"shop_id");//格式化門店ID
四、這樣咱們就能夠直接一條SQL IN語句獲取當前$list裏面全部的門店信息的$shop_info 了,代碼以下:spa
$shops_model = new Shops(); $shop_info = $shops_model->where('id','IN',$shop_id)->field('id,shop_name')->select(); $shop_info ? $shop_info = $shop_info->toArray() : [];//門店信息
五、接下來對 $shop_info 這個數組進行處理,讓門店id成爲鍵名,門店名稱成爲鍵值,能夠用PHP自帶的函數 array_column() ,具體用法說明能夠參考https://www.php.net/manual/zh/function.array-column.php.net
$shop_info = array_column($shop_info,"shop_name","id");
六、最後咱們,直接循環 foreach $list,將處理好的門店信息添加到數據源中,獲得效果以下。code
foreach($list as $k=>$v){ $list[$k]['shop_name'] = $shop_info[$v['shop_id']]; }
ps:其實最開始我是直接在循環$list裏面的時候,直接數據庫查詢門店信息,可是被告知這樣很差,要秉承儘可能少在循環裏面作查詢動做,而後詢問老猿使用 array_column() ,確實效果很好。
呃,這個主要是對 array_column() 的使用作說明,感受確實PHP確實有不少豐富的函數方法,能夠知足主流業務需求,只是不知道,因此寫了大量冗餘代碼┭┮﹏┭┮,老猿的經驗確實值得贊贊。