引用laravel文档中的一段话
你也可以使用 create 方法来保存新模型。 此方法会返回模型实例。 不过,在使用之前,你需要在模型上指定 fillable 或 guarded 属性,因为所有的 Eloquent 模型都默认不可进行批量赋值。当用户通过请求传入意外的 HTTP 参数,并且该参数更改了数据库中你不需要更改的字段时,就会发生批量赋值漏洞。 比如:恶意用户可能会通过 HTTP 请求传入 is_admin 参数,然后将其传给 create方法,此操作能让用户将自己升级成管理员。所以,在开始之前,你应该定义好模型上的哪些属性是可以被批量赋值的。你可以通过模型上的 $fillable 属性来实现。 例如:让 Flight 模型的 name 属性可以被批量赋值:
class XXXXX extends Model
{
protected $fillable = [
'xxx',
'xxx',
'xxx',
'xxx',
'xxx',
];
}
实例如下
class XxxController extends Controller{
public function xxxx (Request $request){
// 获取全部输入的关联数组:
$inputs = $request->input();
TestModel::create($inputs);
// 获取全部输入的关联数组:
$all = $request->all();
TestModel::create($all);
}
}
class XXXXX extends Model
{
// $guarded 类似黑名单机制,如果设置为[] 则此模型所以字段均可批量赋值
protected $guarded = [];
}
批量赋值可以打开,但是需要配合 validate 使用 , 以及通过input->(‘xxx’) 取值。
在获取php数组是有时会出现如下报错
ERROR: Undefined offset: xxx
Undefined index: xxx
laravel提供了helper工具
use Illuminate\Support\Arr;
$testArr = [
'test'=>1,
'test2'=>[
'test3' => 2
]
];
// 第一个参数 源数组
// 第二个参数 key 可通过‘.’链式取值
// 第三个参数 默认值
Arr::get($testArr,'test','');
Arr::get($testArr,'test2.test3','');
背景 目前存在某些字段存储的是key,前端需要中文是 后端循环迭代 从字典中获取。laravel 中提供了更方便的处理逻辑
class XXXXX extends Model
{
// 将relation_name 加入模型中
protected $appends = ['relation_name'];
const RELATION_MAP = [
'myself' => '本人',
'mom' => '妈妈',
'dad' => '爸爸',
'son' => '儿子',
'daughter' => '女儿',
'spouse' => '配偶',
'grandfather' => '爷爷',
'grandmother' => '奶奶',
'other' => '其他',
];
/** 手机号与本人关系中文 实际字段为 relation_name */
public function getRelationNameAttribute()
{
return Arr::get(XXXXX::RELATION_MAP,$this->relation,'');
}
}
背景 患者关联了医生,但是医生已离职 所以系统中软删除。 目前返回的都是医生的名字 但实际应为 xxx(已离职)
class XXXXX extends Model
{
// 获取name字段时进行拦截处理
public function getNameAttribute()
{
// 如果被软删除则返回 (已离职)
$str = $this->trashed()?'(已离职)':'';
// 拼接字符串
return $this->attributes['name'].$str;
}
}