我可以在保存之前覆盖功能:
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 ..
答案 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();