Laravel:如何在集合中隐藏模型属性仅保留表字段?
在Laravel中隐藏模型框架属性,仅保留数据表字段的方法
当然有可行的办法啦!在Laravel里要让集合中的模型只保留数据表字段,隐藏掉table、connection、primaryKey这类框架自带的属性,我平时常用这几种方案,你可以根据自己的场景来选:
1. 模型内直接配置隐藏/可见字段
这是最直接的方式,在对应的模型类里通过$hidden属性指定要隐藏的框架属性,或者用$visible属性只声明允许显示的字段:
方式A:使用$hidden隐藏指定属性
class Product extends Model { // 把所有不想显示的框架属性加入这个数组 protected $hidden = [ 'table', 'connection', 'primaryKey', 'keyType', 'fillable', 'guarded', 'timestamps' ]; }
当你把模型转换为数组($model->toArray())或JSON($model->toJson())时,这些属性会被自动过滤,集合中的每个模型都会生效。
方式B:使用$visible只允许显示指定字段
如果你的数据表字段不多,也可以反过来,只声明需要显示的字段:
class Product extends Model { // 仅保留这些数据表字段 protected $visible = ['id', 'name', 'price', 'description']; }
这种方式更严谨,新增字段时需要手动添加到$visible里才会显示。
2. 使用API资源类(推荐用于API场景)
如果是做API接口返回数据,Laravel的API资源类是更灵活的方案,能精准控制返回内容,还能对字段做额外处理:
首先创建资源类:
php artisan make:resource ProductResource
然后在生成的app/Http/Resources/ProductResource.php中,只返回需要的字段:
public function toArray($request) { return [ 'id' => $this->id, 'name' => $this->name, 'price' => $this->price, 'description' => $this->description, // 按需添加所有数据表字段,还可以在这里格式化字段,比如: // 'created_at' => $this->created_at->format('Y-m-d H:i:s') ]; }
最后在控制器中返回集合资源:
use App\Http\Resources\ProductResource; public function index() { return ProductResource::collection(Product::all()); }
这种方式完全不会带出任何框架属性,还能统一管理API返回格式。
3. 集合map方法临时转换
如果只是临时处理某个集合,不想修改模型或创建资源类,可以用集合的map方法手动转换每个模型:
$products = Product::all()->map(function ($product) { // 获取模型的原始数据库字段值(未修改的) return $product->getOriginal(); // 如果需要包含修改后的属性值,改用下面的方法: // return $product->attributesToArray(); });
getOriginal()会返回数据库中存储的原始字段值,attributesToArray()则返回当前模型的所有属性值(包括你修改过但未保存的),这两个方法都只会返回数据表对应的字段,不会包含框架属性。
内容的提问来源于stack exchange,提问作者Inove Commerce
相关产品推荐
相关产品推荐

