美文网首页laravel核心
laravel关联模型N+1问题注意点

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

作者: 云龙789 | 来源:发表于2018-08-10 22:57 被阅读16次

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

此处主要想说下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'
);

相关文章

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

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

  • laravel 模型关联

    laravel 模型关联 1、 一对一 2、 定义反向关联(可用户一对多的反向关联) 3、 一对多 4、 多对多 ...

  • laravel关联模型

    例如,如果每个供应商都有一个用户,并且每个用户与一个用户历史记录相关联,那么供应商可以通过用户访问用户的历史记录,...

  • laravel belongsToMany解析

    推荐文章深入理解 Laravel Eloquent(三)——模型间关系(关联) 其实关联模型的效率是最低的,但是我...

  • laravel with 渴求式加载指定字段

    在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 N+1 查询,但是 with 会将目标关...

  • laravel 关联模型使用 with 调数据时指定字段出错

    laravel 关联模型使用 with 调数据时指定字段必须包括 外键的字段 参考: laravel5.1 el...

  • laravel Eloquent:关联

    laravel 官方文档这一页很长,讲了很多东西,大概分为四个部分, 关联,关联查询,预加载,操作关联模型,更新时...

  • rails基础-解决 n+1

    N+1问题是新手常犯的一个问题,这里记录如何解决rails项目中的N+1问题 rails 支持的关联 Active...

  • 查看 Eloquent 模型关联时执行的 SQL 语句

    本文目的是查看 Eloquent 在执行模型关联时运行的 SQL 语句 环境 PHP 7 Laravel 5.1 ...

  • GraphQL(八):GraphQL集成DataLoader

    N+1问题 首先来看看什么是N+1问题,假设我们有如下模型: 然后我们有这样的查询: 会得到类似下面的结果: 根据...

网友评论

    本文标题:laravel关联模型N+1问题注意点

    本文链接:https://www.haomeiwen.com/subject/wsqrbftx.html