求解 Eloquent 关联关系中的 load () 和 loadMissing () 方法的区别

文档中的懒加载部分介绍了load()loadMissing()两个方法,以前也没怎么了解,最近看了 [@overtrue](https://learnku.com/users/76) 大神的一刻开源代码,在api资源中用到了loadMissing()这个方法,才想要具体了解下,文档中并没有怎么介绍,查询了一下相关资料发现也很少,还是没怎么懂这俩方法的区别,以及具体使用场景。故来这里提问,求解。

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

不懂就看源码。。。哈哈

    public function loadMissing($relations)
    {
        // 获取参数
        $relations = is_string($relations) ? func_get_args() : $relations;

       // 使用 load 方法加载
        return $this->load(array_filter($relations, function ($relation) {
            // 过滤掉已经加载过的
            return ! $this->relationLoaded($relation);
        }));
    }

总而言之,就是:仅仅加载从未加载过的关联

5年前 评论
讨论数量: 4

不懂就看源码。。。哈哈

    public function loadMissing($relations)
    {
        // 获取参数
        $relations = is_string($relations) ? func_get_args() : $relations;

       // 使用 load 方法加载
        return $this->load(array_filter($relations, function ($relation) {
            // 过滤掉已经加载过的
            return ! $this->relationLoaded($relation);
        }));
    }

总而言之,就是:仅仅加载从未加载过的关联

5年前 评论

不懂就看源码。。。哈哈

    public function loadMissing($relations)
    {
        // 获取参数
        $relations = is_string($relations) ? func_get_args() : $relations;

       // 使用 load 方法加载
        return $this->load(array_filter($relations, function ($relation) {
            // 过滤掉已经加载过的
            return ! $this->relationLoaded($relation);
        }));
    }

总而言之,就是:仅仅加载从未加载过的关联

5年前 评论

仔细理解了下,貌似是懂了,loadMissing应该是在不知道已经加载了什么关联的情况下用这个可以过滤掉已经加载过的,就是说比load有更好的兼容性?

5年前 评论

@winter-ice 兼容性确实更好,但性能肯定会差一点点点点。。。。哈哈,只差一个 array_filter 和 relationLoaded,Laravel 框架的目标就是优雅,所以它会考虑很多种场景,所以很多时候,功能都是冗余度非常高的,例如:

public function index(Request $request) {
    echo $request->name, PHP_EOL; // 魔术方法 __call()
    echo $request->get('name'), PHP_EOL; // 类方法
    echo $request->input('name'), PHP_EOL; // 类方法
    echo $request['name'], PHP_EOL; // 用到了 ArrayAccess 接口
}
5年前 评论

超哥说了: load 不管有没有都去数据库查 loadMissing 只加载没加载过的

4年前 评论
CodeFarmer 2年前

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