laravel 关于访问器与序列化追加json值的使用问题 append()无效问题
程序员文章站
2022-05-03 09:44:38
...
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’


下一篇: python三种时间格式的转换