是否可以向 Laravel 模型添加非持久属性?
Posted
技术标签:
【中文标题】是否可以向 Laravel 模型添加非持久属性?【英文标题】:Is it possible to add non-persistent attributes to Laravel models? 【发布时间】:2018-07-08 23:48:12 【问题描述】:我正在使用 Laravel (Lumen) 创建一个 API,其中的对象包含一个字段,该字段是文件的路径。 这些路径作为相对路径存储在数据库中,但在将它们返回给用户时,我必须将它们转换为绝对 url。
现在我想知道是否有一种方便的方法可以将非持久字段添加到模型对象。显然有Mutators,但它们被持久化到数据库中。
我还想过创建一个后中间件,它遍历对象树并转换它找到的每个 path
字段,但这不是一种优雅的方式。
这是我需要的最终转换:
[
"id": 1,
"title": "Some title",
"media": [
"id": 435,
"path": "relative/path/to/some/file.ext"
,
"id": 436,
"path": "relative/path/to/some/file2.ext"
]
]
收件人:
[
"id": 1,
"title": "Some title",
"media": [
"id": 435,
"url": "http://example.com/relative/path/to/some/file.ext"
,
"id": 436,
"url": "http://example.com/relative/path/to/some/file2.ext"
]
]
欢迎提出任何想法。
【问题讨论】:
【参考方案1】:你可以使用Laravel accessors,
来自Docs:
列的原始值被传递给访问器,允许 你来操作和返回值。
这些不会保存在数据库中,但会在您访问它们时进行修改。
例如:
class User extends Model
/**
* Get the user's first name.
*
* @param string $value
* @return string
*/
public function getFirstNameAttribute($value)
return ucfirst($value);
用法:
$user = App\User::find(1);
$firstName = $user->first_name;
在您的用例中:
在媒体模型中为路径属性定义一个访问器。
public function getPathAttribute($value)
return storage_path($value);
如果您需要使用不同的名称(别名)访问属性:
public function getAliasAttribute()
return storage_path($this->attributes['path']);
// $model->alias
【讨论】:
优秀,-1 分,因为我没有彻底阅读文档。谢谢大佬。 @HamedMomeni 请也查看更新的答案我添加了一个与您的用例相关的示例 再次感谢,但有办法更改字段名称本身吗? @HamedMomeni 是的,你可以。请查看我的更新答案【参考方案2】:正如@Sapnesh Naik 所说,您需要的是一个简单的accessor ,如下所示:
public function getPathAttribute($value)
$url = config('relative_url') or env('PATH') or $sthElse;
return $url.$this->attributes['path'];
【讨论】:
以上是关于是否可以向 Laravel 模型添加非持久属性?的主要内容,如果未能解决你的问题,请参考以下文章