关于php:Laravel 5.5-防止在模型更新期间使用其他属性

Laravel 5.5 - Prevent additional attribute to be used during model update

users表以及其他表具有以下字段:username,first_name,last_name。每个用户都可以决定显示用户名还是全名(姓氏)。此选择存储在"设置"表中。

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

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

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

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


这是Modelget{...}Attribute()功能派上用场的地方。假设您要访问$user->full_name而不将full_name实际保存到数据库中。由于具有first_namelast_name,因此可以在User模型上声明:

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

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

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

在您的User.php模型中:

1
2
3
4
5
6
7
8
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以显示以下三种情况之一(由上面的逻辑/返回语句确定):

1
2
3
4
5
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();