Model的paginate如何添加自定义属性

1. 运行环境

1). 当前使用的 Laravel 版本?

Lavavel 9

2). 当前使用的 php/php-fpm 版本?

PHP 版本:8.1

2. 问题描述?

Model的paginate,如何添加自定义属性?

//模型
class User extends Model
{

    public function getDeptNameAttribute($value,$attributes)
    {
        return $this->dept->name ;
    }
}
//控制器中调用分页
use App\Models\User;
$list = User::with('dept')->where('xx','xx')->paginate(10);
return Response::json($list);

//结果中没有dept_name,在模型中添加
protected $appends = ['dept_name'];
//结果可正常打印出dept_name,
//但是查询其他不包含dept_id的时候,会报错
//改进
public function getDeptNameAttribute()
{
    return isset($this->attributes['dept_id']) ? $this->dept->name :'' ;
}
//这样实现了不查询dept_id时,不报错,代码正常运行
//但存在查询dept_id却不需要dept_name的时候
$list = User::select(['dept_id',...])->limit(10)->get();
//出现N+1问题了:sob:
//一次select from user;
//10次select from dept;

综上所述:
在使用分页器的时候,怎么才能向普通查询一样通过append添加属性

//普通查询这样就行了
$list = User::with('dept:id,name')->where('xx','xx')->get(10)->append(['dept_name]);
//分页是如何处理?
$list = User::with('dept')->where('xx','xx')->paginate(10);
//只能用foreach($list->items() as $item)吗?
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
最佳答案

试试,这样或许可以。

$list = User::with('dept')->where('xx','xx')->paginate(10)->through(function($item){
    $item->append('dept_name');
});

// PHP 7.4+
$list = User::with('dept')->where('xx', 'xx')->paginate(10)
    ->through(fn($item) => $item->append('dept_name'));
2年前 评论
jatdung 2年前
____Laravel (楼主) 2年前
____Laravel (楼主) 2年前
Rache1 (作者) 2年前
Rache1 (作者) 2年前
讨论数量: 9

试试,这样或许可以。

$list = User::with('dept')->where('xx','xx')->paginate(10)->through(function($item){
    $item->append('dept_name');
});

// PHP 7.4+
$list = User::with('dept')->where('xx', 'xx')->paginate(10)
    ->through(fn($item) => $item->append('dept_name'));
2年前 评论
jatdung 2年前
____Laravel (楼主) 2年前
____Laravel (楼主) 2年前
Rache1 (作者) 2年前
Rache1 (作者) 2年前

几个月前回答过一样的问题 :joy: 问答:laravel9.x paginate使用了makeHidden就转成了集合 就不能使用分页了...

    $list = User::with('dept')
                ->where('xx','xx')
                ->paginate(10)
                ->getCollection()
                ->append(['dept_name']);

@____Laravel 那改一下就是

    $list = User::with('dept')
                ->where('xx','xx')
                ->paginate(10);

    $list->getCollection()->append(['dept_name']);
2年前 评论
____Laravel (楼主) 2年前

用resource不好吗

2年前 评论

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