laravel关联模型N+1问题注意点

关联模型最大的优势是关联好了模型,我们不必再代码中写那么多的表关联来取数据,可以简单的几行代码即可取出复杂的关联模型数据。

此处主要想说下N+1的问题。
其实N+1 使用with的本质是在首次查询中使用了whereIn查询,比如一个订单表关联的表

    public function getById($id, $userId = 0)
    {
        $query = $this->model->where('mall_order_id', $id);
        if ($userId) {
            $query = $query->where('user_id', $userId);
        }
        $query = $query->with(
            'belongsToOneUser', // 关联一个用户
            'hasManyDetail.belongsToOneCommodity',  // 关联订单详情中的一个商品
            'hasManyDetail.belongsToOneSku', // 关联订单详情中的一个sku_id
            'belongsToOneMerchant' // 关联一个门店
        );
        return $query->first();
    }
图片.png

可以看到一条语句是把所有的关联数据都给取出来了

这个时候,我们取订单值

应该使用
$orderlList = $order->hasManyDetail;
这种方式可能是框架中有一定的规则,会直接在$order对象中取 has_many_detail 的值

如果使用以下方式,则会重新生成一条sql查询,既产生N+1的问题
$orderlList = $order->hasManyDetail()->get();

注意:

  • 既然解决的是N+1问题,那么 如果是只查询一条语句,就不需要使用with()。因为他是使用whereIn([n]) 也就是数组中只有一个值的方式查询的,这种方式反而不如直接查询。

  • 但是如果你要关联一个模型中的模型,那么你可以继续使用with()方法。

比如我上面的sql其实可以优化成

$query = $query->with(
    'hasManyDetail.belongsToOneCommodity',
    'hasManyDetail.belongsToOneSku'
);
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Eloquent: 关联模型 简介 数据库中的表经常性的关联其它的表。比如,一个博客文章可以有很多的评论,或者一个...
    Dearmadman阅读 17,357评论 6 16
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,038评论 2 89
  • 要说30天能养成一个好习惯,对于写作这件事儿,通过这个月的“自虐”,我想我算是完成一个良好的开端。我自认不是一个意...
    一只夏阅读 253评论 4 2
  • 一抽# 每一位都可以通过这张卡片觉察自己 1、直觉他叫什么名字?华华 2、他几岁了?八个月 3、他现在是什么状态?...
    颜荧梅生育哺育顾问157158阅读 162评论 0 0
  • 躺在床上,形体的放松让自己陷入了安逸的假象。 寝室一共有四张床,床上铺满了冬日各色各样的棉被,红色和白色的围巾搭在...
    丢了书生气质的连衣裙阅读 183评论 0 0