Laravel set mutator从create方法中的语句中删除属性

时间:2018-03-27 14:58:12

标签: php laravel laravel-5 eloquent

我正在困扰Laravel的一个问题。我有一个名为News的模型

class News extends Model {

    protected $fillable = ['title', 'content', 'published_at'];

    protected $dates = ['created_at', 'updated_at', 'published_at'];

    public function author() {
        return $this->belongsTo(User::class, 'user_id');
    }

    public function setPublishedAtAttribute($value) {
        return Carbon::createFromFormat('d/m/Y H:i', $value)->toDateTimeString();
    }

    public function scopePublished($query) {
        return $query->whereDate('published_at', '<', Carbon::now());
    }

    public function scopeLatestNews($query) {
        return $query->latest()->with('author');
    }

}

当我尝试存储新的新闻资源时:

public function store(StoreBlogPost $request) {
    $news = Auth::user()->news()->create($request->all());

    return redirect()->route('blog.show', $news);
}

我收到了一个QueryException SQLSTATE [HY000]:一般错误:1364字段'published_at'没有默认值。
查询看起来像那样

insert into `news` (`title`, `content`, `user_id`, `updated_at`, `created_at`)

但是当我删除mutator setPublishedAtAttribute时,错误消失但我得到了一个非格式化的日期错误(这就是我使用mutator的原因)。

1 个答案:

答案 0 :(得分:5)

你的mutator应该设置属性,而不是返回它的新值:

public function setPublishedAtAttribute($value) {
    $this->attributes['published_at'] = Carbon::createFromFormat('d/m/Y H:i', $value)->toDateTimeString();
}