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
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3

兄弟, 你这里有个bug.

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

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

5年前 评论
uniteweiwei 5年前
uniteweiwei 5年前

@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);
}
5年前 评论

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