Laravel定义一个变异者

时间:2017-05-25 10:45:01

标签: php mysql laravel

<?php

namespace App;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;

class UserInformation extends Model {

    /**
     * The table associated with the model.
     *
     * @var string
     */
    protected $table = "user_information";

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'title',
        'first_name',
        'last_name',
        'img_path',
        'born',
        'gender',
        'address',
        'country_id',
        'about',
        'institution',
        'area_of_expertise',
        'cv_path',
        'facebook',
        'twitter',
        'instagram',
        'linkedin',
        'university',
        'university_graduated_at',
        'md',
        'md_graduated_at',
        'associate_professor',
        'associate_professor_graduated_at'
    ];

    public function setBornAttribute($date) {
        $this->attributes['born'] = Carbon::createFromFormat('Y-m-d', $date);
    }

    public function users() {
        return $this->belongsTo('App\User', 'user_id', 'id');
    }
}

错误:

  

SQLSTATE [22007]:无效的日期时间格式:1292日期值不正确:   '26 / 10/1988'对于第1行的'born'列(SQL:update   user_information

如何更新:

public function updateUser($request, $id) {
        $user = User::with('userInformation')->findOrFail($id);
        $user->update(array_filter($request->all()));
        $user->userInformation()->update(array_filter($request->only([
            'title',
            'first_name',
            'last_name',
            'img_path',
            'born',
            'gender',
            'address',
            'country_id',
            'about',
            'institution',
            'area_of_expertise',
            'cv_path',
            'facebook',
            'twitter',
            'instagram',
            'linkedin',
            'university',
            'university_graduated_at',
            'md',
            'md_graduated_at',
            'associate_professor',
            'associate_professor_graduated_at'
        ]), 'strlen'));

        return User::with('userInformation')->findOrFail($id);
    }

我从用户界面发送出生日期d / m / Y格式。当我将这些数据存储在mysql中时,我需要重新格式化为Y-m-d ..

我用Google搜索并发现了变异器: https://laravel.com/docs/5.3/eloquent-mutators

我将setNameAttribute函数添加到UserInformation模型。然后我刷新了页面,然后再次尝试。但没有改变。我得到了同样的错误。

我该如何解决这个问题?

P.S。 :我正在使用Laravel 5.3

5 个答案:

答案 0 :(得分:1)

使用碳parse

public function setBornAttribute($value)
{
    $this->attributes['born'] = Carbon::parse($value);
}

答案 1 :(得分:0)

您必须在模型上设置属性 $ dateFormat ,如下所示:

protected $dateFormat = 'Y-m-d';

Check the documentation about date mutators

答案 2 :(得分:0)

将设置功能更改为:

public function setBornAttribute($date) {
    $this->attributes['born'] = Carbon::createFromFormat('d/m/Y', $date)->format('Y-m-d');
}

答案 3 :(得分:0)

以下是答案:

Laravel 5 mutators only work when I create a record and not when I update a record

我将$user->userInformation()->update(更改为$user->userInformation->update(并且有效。

答案 4 :(得分:0)

Laravel对日期字段有本机支持。试试这个:

class UserInformation extends Model {

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

 //Rest of model without mutator

}