Laravel Eloquent 返回结果优化

前言

我们都知道在模型中使用 appends 属性来构建访问器使得返回结果添加一些字段信息,但是这样的话有一个坏处,就是所有这个模型的返回结果都会有这些字段信息,如果接口中规定了严格的返回信息字段,这样就不合适了。
能不能有好的方法动态的显示或隐藏这些字段信息呢?
答案是肯定的。

动态显示

在接口中临时显示

首先在 Model 中构建访问器

public function getUsernameAttribute(){
    return $this->hasOne('App\User','id','user_id')->value('username');
}

Model 不建立 appends 属性

单条记录

public function getUserInfo(Request $request){
    $id = $request->get('id',null);
    $result = User::find($id)->append('username');
    return response()->json($result);
}

多条记录

public function getUsers(Request $request){
    $limit = $request->get('limit',10);
    $results = User::orderBy('id','desc')
                    ->paginate($limit)
                    ->transform(function($item,$key){
                        $item->append('username');
                        return $item;   //如果不 return 出去返回的是 null
                    });
    return response()->json($results);
}

在接口中临时隐藏

如果已经添加了很多 appends 属性,那么把上边临时显示的

append($attribute)

方法替换成

addHidden($attribute)

就可以了

本作品采用《CC 协议》,转载必须注明作者和本文链接
chaosir
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 3

兄弟, 你这里有个bug.

->paginate($limit)
->transform(function($item,$key){
    $item->append('username');
    return $item;   //如果不 return 出去返回的是 null
});

这样返回到前端的 json 内容就不是 原本的分页的格式了

4年前 评论
uniteweiwei 4年前
uniteweiwei 4年前

@uniteweiwei 你的是这么写的

public function getUsers(Request $request){
    $limit = $request->get('limit',10);
    $results = User::orderBy('id','desc')
                    ->paginate($limit)
                    ->transform(function($item,$key){
                        $item->append('username');
                        return $item;   //如果不 return 出去返回的是 null
                    });
    return response()->json($results);
}

改成:

public function getUsers(Request $request){
    $limit = $request->get('limit',10);
    $results = User::orderBy('id','desc')->paginate($limit);

    foreach($results as $result){
        $result->append('username');
    }

    return response()->json($results);
}
4年前 评论

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