php - 将字符串转换为碳

标签 php date laravel-5.1 php-carbon

我正在使用 Laravel 5.1

几天前我使用了protected $dates = ['license_expire']在我的模型中将字符串日期转换为 Carbon 实例。在 HTML 中,创建表单中日期的默认值为 Carbon\Carbon::now()->format('Y-m-d')

为了在主页显示警报,我使用了 <p>Licence Expired: <b>{{ $employee->license_expire < Carbon\Carbon::now()?'License has expired':$employee->license_expire->diffForHumans() }}</b></p>

到那时 diffForHumans() 方法工作正常。

但在这种情况下,无论数据库中有什么,编辑表单的默认值也是今天的日期(我使用的是部分表单)。为了解决它,我将 HTML 中的默认值更改为 NUll。并在我的模型中添加另一个方法以在创建表单中显示当前日期。

public function getLicenseExpireAttribute($date)
{
    return Carbon::parse($date)->format('Y-m-d');
}

之后,当我转到主页时,我有一个 FatalErrorException上面写着 Call to a member function diffForHumans() on string

当我用 dd($employee->license_expire) 查看日期时它又变成了 STRING。

谁能告诉我在这种情况下如何将字符串转换为 Carbon?

将我创建表单的默认日期设置为今天的日期,从数据库中编辑表单的日期,我可以使用 diffForHumans() 在主页中显示警报?

最佳答案

你快到了。

删除 protected $dates = ['license_expire']

然后将您的 LicenseExpire 访问器更改为:

public function getLicenseExpireAttribute($date)
{
    return Carbon::parse($date);
}

这样,无论如何它都会返回一个 Carbon 实例。 因此,对于您的表单,您只需 $employee->license_expire->format('Y-m-d') (或任何需要的格式)并且 diffForHumans() 应该可以工作在您的主页上也是如此。


如果你使用 Laravel 9+,你可以选择使用更新的语法来定义 Accessors :

use Illuminate\Database\Eloquent\Casts\Attribute;

public function licenseExpire(): Attribute 
{
    return Attribute::make(
        get: fn ($value) => Carbon::parse($value);
    );
}

关于php - 将字符串转换为碳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32549221/

相关文章:

javascript - 重写 Javascript Date 构造函数?

bash - 使用参数变量在 bash 脚本中获取 X 天前的日期

date - 如何在Elasticsearch映射中从 “_all”中排除所有数字和日期

php - Laravel 5.1 如何使用迁移创建 MySQL 存储过程

php - 如何在 CodeIgniter 中调用存储过程?

javascript - 如何从另一个表创建我的 php 表

php - 拉维尔 5 : How to retrieve deleted related models?

php - 使用 Laravel 在生产环境中禁用 Log::info

php - mysql_select_db() 导致我的 $_POST 变量为空

php - 如果数据库大小接近 2GB,请更改打印输出