在laravel 5.3中使用带有存取器的模型

时间:2017-02-14 16:51:59

标签: php json laravel casting

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

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

所以我永远不会在我的视图中获得NULL值。有没有办法比仅仅在accessor和mutator中实现强制转换逻辑更容易?

1 个答案:

答案 0 :(得分:1)

如果您希望该字段显式遵循$casts定义,则可以使用以下解决方案。您只需要从访问器mutator内部手动调用cast函数:

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;
}

这种方法假设您将来可能会更改演员表,但是如果您知道它始终是一个array / json字段,则可以这样替换castAttribute()调用:

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

    /** set defaults for $example **/

    return $example;
}