在 laravel 5.3 中使用带有访问器的强制转换

Posted

技术标签:

【中文标题】在 laravel 5.3 中使用带有访问器的强制转换【英文标题】:Using casts with accessor in laravel 5.3 【发布时间】:2017-07-03 01:48:01 【问题描述】:

我想使用 laravel (5.3) eloquent 的 $casts 属性,如 protected $casts = ["example" => "object"]getExampleAttribute 访问器,但似乎访问器丢弃了 $casts 行为。这对我来说至关重要,因为我想将 JSON 对象存储在数据库中并为其设置默认值,例如:

public function getExampleAttribute($value) 
    if($value === NULL) 
        return new \stdclass();
    return $value

所以我永远不会在我的视图中得到 NULL 值。有没有办法比在访问器和修改器中显式地实现强制转换逻辑更容易?

【问题讨论】:

我对转换属性没有任何经验。但是我知道有类似mutators 的东西。另一个建议是使用events。 【参考方案1】:

如果您希望该字段明确遵循$casts 定义,则以下解决方案有效。您只需要从访问器突变器内部手动调用强制转换函数:

public function getExampleAttribute($value)

    // force the cast defined by $this->casts because
    // this accessor will cause it to be ignored
    $example = $this->castAttribute('example', $value);

    /** set defaults for $example **/

    return $example;

这种方法有点假设您将来可能会更改演员阵容,但如果您知道它始终是一个数组/json 字段,那么您可以像这样替换 castAttribute() 调用:

public function getExampleAttribute($value)

    // translate object from Json storage
    $example = $this->fromJson($value, true)

    /** set defaults for $example **/

    return $example;

【讨论】:

以上是关于在 laravel 5.3 中使用带有访问器的强制转换的主要内容,如果未能解决你的问题,请参考以下文章

在布局中的 Laravel 5.3 视图中包含 PHP 变量

Laravel 5.3 Passport API 在 Postman 中使用个人访问令牌未经身份验证

带有 JWT 身份验证的 Laravel 5.3 CORS

带有引导日期选择器的 Laravel 4

laravel 5.3 护照和角度存储访问令牌

如何处理带有斜线的 Laravel Eloquent “WHERE”查询? (Laravel 5.3)