使用Laravel 5.2从数据库中存储的Y-m-d日期计算年龄

25

用户通过表单将他们的出生日期添加到存储在数据库中的表单中,

我想从数据库中存储的日期(格式为Y-m-d)计算年龄,

我的问题是:

  • 如何计算年龄?

  • 逻辑放在控制器(Controller)还是模型(Model)中?

  • 如何以'm-d-Y'的格式在视图(View)中传递存储的日期?

  • 如何将年龄这个逻辑的结果传递到视图(View)中。

  • 我在我的模型(Model)中使用类似下面的东西,这样做对吗?

这是控制器(Controller):

public function index()   {   
    $profile   = User::find($this->userid())->profiledetailsHasOne;  //This has Dob field                   
    return view('profile.index',['profile' => $profile ]); 
}

这是我的模型:

public function getAge(){
    $this->birthdate->diff($this->attributes['dob'])
    ->format('%y years, %m months and %d days');
}

这是我的视图:

<tr>
    <th>Age</th>
    <td>{{$profile->getAge()}}</td>
</tr>

这样对吗?我得到以下错误:

调用空值成员函数diff()

10个回答

65

日期可以是 Carbon 的实例,它提供了各种有用的方法。

在你的模型中,导入 Carbon 类:

use Carbon\Carbon;

并定义一个访问器:

/**
 * Accessor for Age.
 */
public function age()
{
    return Carbon::parse($this->attributes['birthdate'])->age;
}

然后您可以像访问常规属性一样调用age。例如,在Blade视图中:

<p>{{ $user->age() }} years</p>

由于标题中提到了“... Laravel 5.2”,因此提到这种方法仍适用于Laravel 5.6,并且尚未在5.7中进行测试,但猜测它会产生相同的效果,可能会有所帮助。 - alex t
1
@alext 我可以确认这在 Laravel 7.x 上仍然有效。 - Pathros
访问器最好定义为 public function getAgeAttribute(),然后调用时只需要 {{ $user->age }} - themrflibble

30

直接在您的视图中显示:

\Carbon\Carbon::parse($user->birth)->diff(\Carbon\Carbon::now())->format('%y years, %m months and %d days');

这正是我正在寻找的 +1 - hassanrazadev
我得到了像0年,0个月和1天这样的结果。 - CodeGuru

5

我在我的模型中添加了这段代码:

protected $appends = ['age'];

public function getAgeAttribute()
{
   return Carbon::parse($this->attributes['birthday'])->age;
}

4

在 Laravel 7 中:

$dateOfBirth = '1990-01-01';
$years = \Carbon::parse($dateOfBirth)->age;
  
dd($years); // 31

2

感谢您的所有建议。

使用carbon非常简单和出色。

我在模型中添加了此代码:

public function age() {
return $this->dob->diffInYears(\Carbon::now());
 }

@frvanhove 我也成功地将数据库中的日期格式从 'Y-m-d' 更改为在视图中传递日期的 'd-m-Y'。我将此代码放置在模型中 public function getDOB(){ return $this->dob->format('d-m-Y'); } - sanainfotech

1
使用内置的Carbon,在Laravel中计算年龄最好不过了。在Laravel中返回的日期已经是Carbon格式。
这个逻辑应该作为模型的默认getter放在模型中。
public function getAge(){
    $this->birthdate->diff(Carbon::now())
         ->format('%y years, %m months and %d days');
}

这将导致“23年6个月26天”的结果。
查看http://carbon.nesbot.com/docs/文档,了解您可以使用它进行的所有有趣操作。
假设您在视图中使用模型,并且由于您应该在该模型中创建一个getAge()函数。
您可以在视图中调用您的模型,如$user->getAge()

我按照你说的尝试了,但是出现了错误。我已经编辑了我的问题,请您再次查看。请告诉我哪里出错了。 - sanainfotech
看起来你已经搞定了 ;) - Frederiek
感谢您的帮助! - sanainfotech
这个程序是否独立于日期和月份格式的位置而工作?比如一个人的生日是2月3日,它怎么知道不是3月2日? - Eric McWinNEr
在调用$this->birthdate之前,你应该先解析它,否则可能会出现错误,例如“在字符串上调用成员函数diff()”。 - dtmiRRor
0年,0个月,1天 - CodeGuru

1
use App\User;
use Carbon\Carbon;

Route::get('/userage',function(){

    $user_info = User::find(1);
    // When  ( $table->date('birthday'); ) 
    $birthday = $user_info->birthday;
    $user_age = Carbon::parse($birthday)->diff(Carbon::now())->format('%y years, %m months and %d days');

    echo($user_age); 
});

0
我还成功地将数据库中的日期格式“Y-m-d”更改为视图中的传递日期格式“d-m-Y”。我将此代码放置在模型中。
public function getDOB(){ 
return $this->dob->format('d-m-Y'); 
 }

0

在您的 Blade 模板中执行以下操作

@php
    $birthday = $user->date_of_birth;
    $age = Carbon\Carbon::parse($birthday)->diff(Carbon\Carbon::now())->format('%y years, %m months and %d days');
@endphp

        <p>{{$age}}</p>

0
在 Laravel 的 User.php 模型中:
添加了这些函数。
public function getAge() {
    $format = '%y years, %m months and %d days';
    return \Carbon\Carbon::parse(auth()->user()->dateofbirth)->diff(\Carbon\Carbon::now())->format($format);
}

在视图 Blade 中:
Age: {{ auth()->user()->getAge() }}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接