• 关于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',
        ];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    可能存在情况

    实例如下

    class XxxController extends Controller{
        public function xxxx (Request $request){
            // 获取全部输入的关联数组:
            $inputs = $request->input();
            TestModel::create($inputs);
            
            // 获取全部输入的关联数组:
            $all = $request->all();
            TestModel::create($all);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    解开此限制
    class XXXXX extends Model
    {
        // $guarded 类似黑名单机制,如果设置为[] 则此模型所以字段均可批量赋值
        protected $guarded = [];
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    建议

    批量赋值可以打开,但是需要配合 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','');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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,'');
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    model 查询后字段值改写

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

    class XXXXX extends Model
    {
        // 获取name字段时进行拦截处理
        public function getNameAttribute()
        {
            // 如果被软删除则返回 (已离职)
            $str = $this->trashed()?'(已离职)':'';
            // 拼接字符串
            return $this->attributes['name'].$str;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  • 相关阅读:
    Java、Spring、Dubbo三者SPI机制原理与区别
    华为政企网络安全产品集
    Win10系统修改用户名以及C盘下Users用户名实操手册(实测有效)
    金仓数据库KingbaseES客户端应用参考手册--14. sys_receivewal
    小游戏开发周期多长时间
    【数学模型】基于Matlab模拟疫情 SEIRS模型
    css步骤条
    docker学习-入门篇
    Jitter
    关于我的博客~ (2022.8.25 -> 在csdn三岁啦)
  • 原文地址:https://blog.csdn.net/qq_32930863/article/details/127808593