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

时间:2019-01-11 16:26:08

标签: php laravel laravel-5

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

为避免在需要显示名称的任何时间重复执行查询和调用函数,我将名称创建后显示在用户对象上,例如根据用户的选择$user->display_name = ...。< / p>

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

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

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

1 个答案:

答案 0 :(得分:0)

这是get{...}Attribute()的{​​{1}}功能派上用场的地方。假设您要访问Model而不实际将$user->full_name保存到数据库。由于您拥有full_namefirst_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}}