如何实施laravel定制碳时间戳?

时间:2015-02-16 22:31:00

标签: php laravel schema eloquent

我想要一个未来的时间戳来进行比赛'在我的表中过期。我可以毫无问题地输入时间,除非我检索输入时它似乎没有给我一个碳实例但只是一个带有时间的字符串?

public function store(ContestRequest $request)
{
    $input = Request::all();

    // Set the 'owner' attribute to the name of the currently logged in user(obviously requires login)
    $input['owner'] = Auth::user()->name;

    // Set the enddate according to the weeks that the user selected with the input select
    $weeks = Request::input('ends_at');

    // Add the weeks to the current time to set the future expiration date
    $input['ends_at'] = Carbon::now()->addWeeks($weeks);

    Contest::create($input);

    return redirect('contests');
}

这就是我用来创建新竞赛的时间,表格中的时间格式与created_at和updated_at字段完全相同。当我尝试类似的东西时,他们似乎返回了一个Carbon实例:

$contest->created_at->diffForHumans()

为什么我没有退回碳实例?

我的迁移文件如下所示:

$table->timestamps();
$table->timestamp('ends_at');

2 个答案:

答案 0 :(得分:16)

您只需将其添加到模型中的$dates属性即可。

class Contest extends Model {
    protected $dates = ['ends_at'];
}

这告诉Laravel将ends_at属性视为处理updated_atcreated_at


@Jakobud你不必担心覆盖created_atupdated_at。它们将与$dates数组合并:

public function getDates()
{
    $defaults = array(static::CREATED_AT, static::UPDATED_AT);
    return array_merge($this->dates, $defaults);
}

static::CREATED_AT解析为'created_at'static::UPDATED_AT解析为'updated_at'

答案 1 :(得分:2)

Laravel仅将其默认时间戳转换为 Carbon created_atmodified_at)。对于任何其他时间戳(例如您的ends_at列),您可以在Contest模型中定义属性访问者:

public function getEndsAtAttribute($value)
{
    return Carbon::createFromTimeStamp(strtotime($value));
}

当您致电datetime时,这会将从数据库返回的Carbon字符串转换为$contest->ends_at个实例。