laravel 关于访问器与序列化追加json值的使用问题 append()无效问题

mac2025-04-19  4

laravel 关于访问器与序列化追加json值的使用问题 append()无效问题

关于访问器使用

先创建一个访问器,我们拿id举例吧

<?php namespace App; use Illuminate\Database\Eloquent\Model; class User extends Model { /** * @param string $value * @return string */ public function getIdNameAttribute($value) { return md5($value); } }

访的该字段就会自动执行访问器

$user = App\User::find(1); $id = $user->id; # 结果 "c81e728d9d4c2f636f067f89cc14862c"

特别说明一点 访问到字段id才会起作用,列表也可以被执行

关于序列化追加值

***这这里我们必须要搞清楚以下几点***

模型内定义的 appends 字段是可以在单条查询和列表查询都可以追加控制器或路由模型调用append()或setAppend()方法 查询单条数据可以追加数据,但是列表查询并未追加,需要通过迭代集合来添加

下面的实例只会演示列表查询,单条查询正常使用没毛病

在给出数据的时候我们可能要加密id,但是后台也用id,导致业务冲突,那就需要将id别名了,但同时得保留id,毕竟后台是靠id处理的,所以就有了追加值。 继续用id测试(测试都是在user模型) 首先我们给模型$appends添加属性名,也就是你要追加值的名字 (注意,尽管访问器使用「驼峰命名法」方式定义,但是属性名通常以「蛇形命名法」的方式来引用,使用 append 方法追加属性后,它将包含在模型的数组和 JSON 中。appends 数组中的属性也将遵循模型上配置的 visible 和 hidden 设置)

/** * 追加到模型数组表单的访问器。 * * @var array */ protected $appends = ['ids'];

然后在模型内创建该追加值ids的访问器(驼峰命名) 不要纠结md5加密的事,只是演示而已😄

public function getIdsAttribute() { return id_encode($this->attributes['id']); }

访问我们可以看到 id得到了保留,同时追加了加密的ids  如果给前端提供数据不需要可以隐藏了,这个方法就比较简单了,自己搞吧  

但是总是加密id有些没必要,后台都不需要,只有前台才需要,所有需要动态去追加值 官方说明: 你可以在单个模型实例上使用 append 方法来追加属性。或者,使用 setAppends 方法来重写整个追加属性的数组 模型内

// 隐藏append /** * 追加参数 * @var array */ //protected $appends = ['_ids'];

控制器内

$user = new \App\User(); $user=$user->select('id')->append(['ids'])->get();

结果 _ids 追加并没有 

我们可以看到集合内并没有 append 追加的属性 

现在进行迭代集合

$user = new \App\User(); $user=$user->select('id')->get()->transform(function ($item){ return $item->append(['_ids']); });

哦吼!apends里面有了追加值 ‘_ids’ 

最新回复(0)