【问题标题】:Laravel 5.5 - Prevent additional attribute to be used during model updateLaravel 5.5 - 防止在模型更新期间使用附加属性
【发布时间】:2019-06-06 14:34:12
【问题描述】:

除了其他之外,用户表还具有以下字段:用户名、名字、姓氏。每个用户都可以决定是显示用户名还是显示全名(名字+姓氏)。此选项存储在“设置”表中。

为了在需要显示名称的任何时候不执行重复查询和调用函数,我根据用户的选择将名称添加到用户对象中,例如$user->display_name = ...

问题在于,当用户更新配置文件时,Laravel 会尝试将此名称保存在 display_name 字段中的用户表中,该表不存在并返回 500 错误。当用户尝试注销时也会发生这种情况。

是否可以避免 Laravel 尝试将该值存储在数据库中?

正如其他讨论中所建议的,我已经尝试为 User 模型中的属性提供默认值,我尝试将属性设置为受保护,但没有任何效果。

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    这就是Modelget{...}Attribute() 函数派上用场的地方。假设您想访问$user->full_name 而不实际将full_name 保存到数据库中。既然你有first_namelast_name,你可以在你的User 模型上声明:

    public function getFullNameAttribute(){
        return $this->first_name." ".$this->last_name;
    }
    

    Laravel 会将 getAttribute 之间的内容解析为模型上可用的属性,在本例中为 $user->full_name$user->fullName

    要将其转换为您的用例,您可以使用以下内容:

    在您的User.php 模型中:

    public function getDisplayNameAttribute(){
       if($this->settings == "use_full_name"){
           return $this->first_name." ".$this->last_name;
       } else if($this->settings == "use_username"){
           return $this->username;
       }
       return "Not Configured...";
    }
    

    注意:您必须配置您的 if 语句,以根据您的 settings 确定要返回的内容。

    在控制器或视图中的某处,您可以调用 $user->display_name 以显示 3 件事之一(由上面的逻辑/返回语句确定):

    public function example(){
        $user = User::first();
        dd($user->display_name); 
        // $user->first_name." "$user->last_name, $user->username or "Not Configured..."
    }
    

    通过这样做,当您访问您的$user 时,它将有一个可用的display_name 属性,该属性实际上并不存在于模型上,因此您在调用$user->save(); 时不会遇到问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-23
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2019-10-12
      相关资源
      最近更新 更多