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官方是咋说的,先把这个东西记录下来,为了自己后面不会那么容易忘记,也为了猿们少走一点儿弯路!!!

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