laravel中關於Schema::getColumnListing()方法的一點兒記錄

項目使然,需要用laravel框架開發。寫到DB保存數據的時候,因爲之前有前輩封裝好了關於DB的一些常用操作,就直接拿過來用了。前輩寫的是使用save添加的時候會做一步過濾無用列的操作,那麼,這裏就需要獲取某個表的所有字段,用來對比當前字段是否在表中存在,不存在則需要過濾掉,然後使用了laravel框架封裝好的Schema::getColumnListing()這個方法。

到這裏,問題出現了???使用getColumnListing()獲取到的字段一直是空的!!!納尼?既然是空的,那就往深處去走走,一步一步debug看看問題出在了那裏。一步一步走下去,走到底了,還是沒有發現問題到底出在了哪裏。嗯?這就有點兒意思了。明明有問題,但是沒有找出來,不行,我再看看!看着看着,找到上一步沒有走到的一個類:

class MySqlProcessor extends Processor
{
    /**
     * Process the results of a column listing query.
     *
     * @param  array  $results
     * @return array
     */
    public function processColumnListing($results)
    {
        $mapping = function ($r) {
            $r = (object) $r;

            return $r->column_name;
        };

        return array_map($mapping, $results);
    }
}

打印一下,好像發現了一點兒問題:進來這個函數的時候,$result這個變量是正確的,但是最後return的時候所有數據變成NULL了。嗯哼?逗我,進入閉包函數,打印再看看。這裏打印$r出來之後,發現出來的數據是COLUMN_NAME,但是,後面獲取的時候,變成column_name了,所以return的時候成null值了。問題的源頭找到了,把這裏的$r->column_name改成$r->COLUMN_NAME之後,數據正常了。

但是總感覺怪怪的,哪裏怪呢?回頭再想想,不對,這是laravel框架本身的東西,這個東西不知道多少人在用呢,應該不是簡單的框架問題!!!那是啥問題呢?再思考一下,對了,我的數據庫版本用的是MySQL8.0的最新版本,那是不是版本問題呢?趕緊去切換MySQL版本,切到5.7,將之前的程序改回去,再跑一下,WOC?結果正確的?版本問題?這麼坑?花半天時間,就這麼個問題?不行,還是要深究一下,不然半天時間白白浪費了!拿到sql語句,看一下本質的區別:

SELECT column_name FROM information_schema.columns WHERE table_schema = 'database' AND TABLE_NAME = 'table'

這是mysql5.7獲取到的結果:                  再看看mysql8.0獲取到的結果

                     

看到差別了嗎?同樣的sql語句,獲取到的columu_name字段結果是不一樣的,5.7獲取到的是小寫的,8.0的獲取到的是大寫的。

原來是這麼一回事!!!算了先到這裏吧!我去消化消化,瞅瞅mysql官方是咋說的,先把這個東西記錄下來,爲了自己後面不會那麼容易忘記,也爲了猿們少走一點兒彎路!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章