Laravel:覆盖雄辩的功能以获得结果?

时间:2016-06-16 06:56:14

标签: laravel laravel-5.2

我可以在保存之前覆盖功能:

public function save(array $options = [])
{
    if(isset($this->datesConvert)){
        foreach($this->datesConvert as $date){
            $this->attributes[$date] = Carbon::createFromFormat('d/m/Y', $this->attributes[$date])->format('Y-m-d');
        }
    }
    parent::save($options);

}

但是我可以用哪种方法获得结果?以及这方面的文件在哪里。我正在寻找类似的东西:

public function get()
{

    parent::get();

    if(isset($this->datesConvert)){
        foreach($this->datesConvert as $date){
            $this->attributes[$date] = Carbon::createFromFormat('Y-m-d', $this->attributes[$date])->format('d/m/Y');
        }
    }

}

有了这个,我可以转换10个日期行,而不需要20个mutators ..

3 个答案:

答案 0 :(得分:1)

似乎this URL符合您的需求或使用Attribute casting

  

您可以通过覆盖模型的$ dates属性来自定义哪些字段会自动变异,甚至完全禁用此变异:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * The attributes that should be mutated to dates.
     *
     * @var array
     */
    protected $dates = [
        'created_at',
        'updated_at',
        'deleted_at',
        // more dates
    ];
}

修改

另一种方法是,您可以在模型

中覆盖getAttribute方法
<?php

namespace App;

use Carbon\Carbon;

trait DateFormatting
{
    protected function dateFields()
    {
        return [];
    }

    public function getAttribute($key)
    {
        if ( array_key_exists( $key, $this->dateFields() ) ) {
            return  Carbon::createFromFormat('d/m/Y', $this->attributes[$key])->format('Y-m-d');
        }
        return parent::getAttribute($key);
    }
}

然后您可以在任何模型中使用此特征,只是不要忘记覆盖dateFields

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\DateFormatting;

class User extends Model
{
    use DateFormatting;

    protected function dateFields()
    {
        return [
            'finished_at',
            // other field names that you need to format
    ];
}

毕竟你可以照常访问这些字段(使用魔术__get()

$model->finished_at;

答案 1 :(得分:1)

我找到了解决方案,我的解决方案是:

public function save(array $options = [])
{
    if(isset($this->datesConvert)){
        foreach($this->datesConvert as $date){
            $this->attributes[$date] = \Carbon\Carbon::createFromFormat('d/m/Y', $this->attributes[$date])->format('Y-m-d');
        }
    }

    parent::save($options);

}

public function getAttribute($key)
{
    $value = parent::getAttribute($key);

    if(isset($this->attributes[$key])){
        if(isset($this->datesConvert)  &&  in_array($key, $this->datesConvert)){
            $value = \Carbon\Carbon::createFromFormat('Y-m-d', $value)->format('d/m/Y');
        }

    }

    return $value;
}

答案 2 :(得分:0)

Laravel带来了一些对这个问题非常有用的东西。我不确定它的名称,但你可以修改属性甚至添加这样的新属性:

class YourModel extends Model
{

    ...

    public function getDateAttribute()
    {

        return Carbon::createFromFormat('Y-m-d', $this->attributes[$date])->format('d/m/Y');

    }

    ...

}

您可以检索此属性,如:

$yourModel->date;

评论后编辑@ fico7489

你不能忽视你总是需要修改的事实。但是仍然有一些解决方案可以让它变得更容易。

例如,您可以将日期列更改为字符串,只需使用所需的日期格式存储日期。

其他解决方案应该是通过sql修改日期。 FORMAT(Now(),'YYYY-MM-DD')

laravel中的示例看起来像(未经测试):

YourModel::select([
    '*', 
    DB::raw('
        FORMAT(yourDateColumn,'YYYY-MM-DD')
    ')
])->get();