users表以及其他表具有以下字段:username,first_name,last_name。每个用户都可以决定显示用户名还是全名(名字+姓氏)。此选择存储在“设置”表中。
为避免在需要显示名称的任何时间重复执行查询和调用函数,我将名称创建后显示在用户对象上,例如根据用户的选择$user->display_name = ...
。< / p>
问题在于,当用户更新配置文件时,Laravel试图将此名称保存在display_name
字段内的用户表中(该表不存在,并返回500错误)。用户尝试注销时也会发生这种情况。
是否可以避免Laravel尝试将值存储在数据库中?
正如在其他讨论中所建议的那样,我已经尝试为User模型中的属性提供默认值,我尝试将属性设置为保护状态,但是没有任何效果。
答案 0 :(得分:0)
这是get{...}Attribute()
的{{1}}功能派上用场的地方。假设您要访问Model
而不实际将$user->full_name
保存到数据库。由于您拥有full_name
和first_name
,因此可以在last_name
模型上声明:
User
Laravel将public function getFullNameAttribute(){
return $this->first_name." ".$this->last_name;
}
和get
之间的内容解析为模型上可用的属性,在这种情况下为Attribute
或$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
这样做,当您访问public function example(){
$user = User::first();
dd($user->display_name);
// $user->first_name." "$user->last_name, $user->username or "Not Configured..."
}
时,它将拥有一个$user
属性,该属性实际上在模型上不存在,因此调用{ {1}}