【问题标题】:Is it possible to add non-persistent attributes to Laravel models?是否可以向 Laravel 模型添加非持久属性?
【发布时间】: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"
      }
    ]
  }
]

欢迎提出任何想法。

【问题讨论】:

    标签: php laravel lumen laravel-eloquent


    【解决方案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'];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-09
      • 2017-03-16
      • 2019-09-21
      • 1970-01-01
      • 2022-11-10
      • 2011-05-19
      相关资源
      最近更新 更多