发现一个小问题:pgsql 上使用 User::first () 和 User::find (1) 的结果居然不一致

在本地测试时,二者是完全一致的。不过在heroku上,二者居然不同。
file

从上面的SQL语句也可以看出来,二者取的记录不同。这就表明了在heroku/pgsql上,User表并不是以id升序排列的。为什么会这样呢?

从UsersTableSeeder的run方法中和多次测试结果可以看出:

  • 直接使用教程中的User::insert(array)这种方式,不管是什么方法批量创建100个用户和获取第一个用户,都会导致在heroku上User表id=1的记录不是第一条记录。
  • 而如果将创建用户的方式改为:factory(User::class, 100)->create(),则不会有此问题。但是这样效率偏低(插入N次),而且会激活model中的creating event,导致不必要的active token赋值。
    public function run()
    {
        //factory(User::class, 100)->create();
        $users = factory(User::class, 100)->make();
        //$users = factory(User::class)->times(100)->make();
        User::insert($users->makeVisible(['password', 'remember_token'])->toArray());
        //$user = User::find(1);
        $user = User::first();
        $user->name = '王晓';
        $user->email = '111111@qq.com';
        $user->is_admin =  true;
        $user->activated = true;
        $user->save();
    }

感觉就是pgsql和mysql的一点小差异了。其实意义也不大,这里写出来这是提醒自己不要忘记。。

有了这样的差异,在heroku上处理页面展示时,就不能直接取出来了,而需要增加一个排序什么的。比如,在\App\Http\Controllers\UsersController::index方法中增加orderBy('id')

日拱一卒
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 5

就为了这文章,测试了2小时啊。。。

5年前 评论

:thumbsup: 我当时就自己偷偷地做了点优化,没像你这样写了篇文章出来

5年前 评论

@doderic 其实也是和兄弟讨论过后才敢这么写的,不然或者我的标题就应该改为求助了?:smile:

5年前 评论

pgsql 默认排序算法与 mysql 有区别,pgsql 查询排序要加,否则会返回不可预期的结果。官方文档上有说明了。
https://www.yiibai.com/manual/postgresql/q...
也是看你发现了这个问题,去确认了一下。:+1:

5年前 评论

这个其实是 MySQL 的问题,索引组织表默认就是有排序的。其他数据库堆表默认是没有排序的。 www.rockdata.net/zh-cn/docs/14/que...

8个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!