关于访问器的一个问题

我使用版本是Laravel Framework 5.7.28

二话不说,先上代码。

getList() 是获取列表方法,然后我定义了一个访问器(访问器的字段是数据表中不存在的)。

/**
     * 获取列表
     * @param array $where
     * @param int $pageSize
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) \Illuminate\Contracts\Pagination\LengthAwarePaginator
     */
    public static function getList($where=[], $pageSize=20){
        $list = self::where($where)
            ->select('id','nickname','phone','type')
            ->paginate($pageSize);
        return $list;
    }

    /**
     * 团队人数
     * [[@return](https://learnku.com/users/31554)](https://learnku.com/users/31554) string
     */
    public function getTeamSizeAttribute()
    {
        return 'vvvvv';
    }

然后我请求下getList()方法,返现返回字段不存在team_size字段。

{
    "statusCode": 0,
    "message": "success",
    "data": {
        "current_page": 1,
        "data": [
            {
                "id": 1,
                "nickname": "嘿嘿",
                "phone": "556588155",
                "type": 1
            },
            {
                "id": 2,
                "nickname": "。",
                "phone": "5669885548",
                "type": 2
            }
        ],
        "first_page_url": "http://127.0.0.1:8000/getProgramUserList?page=1",
        "from": 1,
        "last_page": 1,
        "last_page_url": "http://127.0.0.1:8000/getProgramUserList?page=1",
        "next_page_url": null,
        "path": "http://127.0.0.1:8000/getProgramUserList",
        "per_page": 20,
        "prev_page_url": null,
        "to": 6,
        "total": 6
    }
}

接下来我添加了 protected $appends = ['team_size']; 好了出现team_size这个字段了。可是模型中其他方法,比如getInfo()也返回了team_size字段,我只想team_size在getList()方法返回。

于是找到了append(),setAppends()这个两个方法。原本我是静态调用,开始改代码。

//C层调用
$list = (new Userinfo)->setAppends(['team_size'])->getList($where,$pageSize);
//M层
public function getList($where=[], $pageSize=20){
  $list = self::where($where)
 ->select('id','nickname','phone','type')
 ->paginate($pageSize);
 return $list;
}

并没有发现返回 team_size 这个字段。。。

于是我开始改M层。先添加 protected $appends = []; 属性。并修改了getList()方法。

    public function getList($where=[], $pageSize=20){
        $this->appends = ['team_size'];
        $list = self::where($where)
            ->select('id','nickname','phone','type')
            ->paginate($pageSize);
        return $list;
    }

可是还是不行。

于是我意识到 appends 属性是在模型初始化的时候进行的赋值,后面无法修改。

大家有没有遇到过这个问题呢。

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

看了下源码似乎单单加了append是不会有的,或者你可以虚构一个查询出来的数据叫team_size

public function getList($where=[], $pageSize=20){
  $list = self::where($where)
 ->select('id','nickname','phone','type', DB::raw("1 as team_size"))
 ->paginate($pageSize);
 return $list;
}

这样? :joy:

4年前 评论
蔺焕然 (楼主) 4年前
sunrise丶 (作者) 4年前
蔺焕然 (楼主) 4年前
小猪蹄子 4年前
sunrise丶 (作者) 4年前
讨论数量: 4

建议使用 API Resource API 资源《Laravel 6 中文文档》 而不是自己写getList

4年前 评论
蔺焕然 (楼主) 4年前
laravel_denghy (作者) 4年前
laravel_denghy (作者) 4年前
蔺焕然 (楼主) 4年前
蔺焕然 (楼主) 4年前
laravel_denghy (作者) 4年前
laravel_denghy (作者) 4年前
蔺焕然 (楼主) 4年前
蔺焕然 (楼主) 4年前
laravel_denghy (作者) 4年前

看了下源码似乎单单加了append是不会有的,或者你可以虚构一个查询出来的数据叫team_size

public function getList($where=[], $pageSize=20){
  $list = self::where($where)
 ->select('id','nickname','phone','type', DB::raw("1 as team_size"))
 ->paginate($pageSize);
 return $list;
}

这样? :joy:

4年前 评论
蔺焕然 (楼主) 4年前
sunrise丶 (作者) 4年前
蔺焕然 (楼主) 4年前
小猪蹄子 4年前
sunrise丶 (作者) 4年前

设置访问器之后,只要调用这个模型就会返回这个东西(如果是SQL,列表查几条数据,就会执行几条SQL)
一定使用的话,你可以在外部在写一个方法(类似API Resource)来筛选

4年前 评论

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