关于model 需要定义 $fillable

关于model 需要定义 $fillable

引用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','');

model 添加自定义字段

背景 目前存在某些字段存储的是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,'');
    }
}

model 查询后字段值改写

背景 患者关联了医生,但是医生已离职 所以系统中软删除。 目前返回的都是医生的名字 但实际应为 xxx(已离职)

class XXXXX extends Model
{
    // 获取name字段时进行拦截处理
    public function getNameAttribute()
    {
        // 如果被软删除则返回 (已离职)
        $str = $this->trashed()?'(已离职)':'';
        // 拼接字符串
        return $this->attributes['name'].$str;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵忠洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值