#php #laravel-4 #timestamp #eloquent
#php #laravel-4 #временная метка #красноречивый
Вопрос:
Я новичок в Laravel. Я создаю приложение с помощью laravel. Когда я создаю сообщение, значения «created_at» и «updated_at» выглядят следующим образом:
2014-06-26 04:07:31
2014-06-26 04:07:31
Но я хочу, чтобы эти значения без времени выглядели так :
2014-06-26
2014-06-26
Только дата без времени.
Возможно ли это???
Пожалуйста, помогите мне.
Моя модель Post:
<?php
class Post extends Eloquent {
protected $fillable = array('title', 'body', 'meta','reporter', 'slug', 'image','top');
public static $rules = array(
'title'=>'required|min:2',
'body'=>'required|min:20',
'reporter'=> 'required|min:2',
'image'=>'image|mimes:jpeg,jpg,bmp,png,gif'
);
public function categories()
{
return $this->belongsToMany('Category');
}
}
Мое хранилище Post Controller:
public function store()
{
$validator = Validator::make(Input::all(), Post::$rules);
if ($validator->passes()) {
$post = new Post;
$post->title = Input::get('title');
$post->body = Input::get('body');
$post->reporter = Input::get('reporter');
$post->meta = Input::get('meta');
$post->slug = Input::get('title');
$post->top = Input::get('top');
$image = Input::file('image');
if ($image) {
$filename = date('Y-m-d-H:i:s')."-".$image->getClientOriginalName();
Image::make($image->getRealPath())->resize(250, 145)->save('public/images/postimages/'.$filename);
$post->image = 'images/postimages/'.$filename;
}
$categories = Input::get('categories');
$post->save();
$post->categories()->sync($categories);
return Redirect::route('admin.posts.index')
->with('message', 'Product Created');
}
return Redirect::back()
->with('message', 'Something went wrong')
->withErrors($validator)
->withInput();
}
Пожалуйста, помогите мне.
Ответ №1:
В вашей Post
модели добавьте два метода доступа, подобные этому:
public function getCreatedAtAttribute($date)
{
return CarbonCarbon::createFromFormat('Y-m-d H:i:s', $date)->format('Y-m-d');
}
public function getUpdatedAtAttribute($date)
{
return CarbonCarbon::createFromFormat('Y-m-d H:i:s', $date)->format('Y-m-d');
}
Теперь каждый раз, когда вы используете эти свойства из своей модели для отображения даты, они будут представлены по-разному, например, просто дата без времени:
$post = Post::find(1);
echo $post->created_at; // only Y-m-d formatted date will be displayed
Таким образом, вам не нужно изменять исходный тип в базе данных. чтобы изменить type
в вашей базе данных, вам нужно изменить его на Date
from Timestamp
, и вам нужно сделать это из вашей миграции (если вы вообще используете) или непосредственно в вашей базе данных, если вы не используете миграцию. timestamps()
Метод добавляет эти поля (с помощью миграции), и чтобы изменить эти поля во время миграции, вам нужно удалить timestamps()
метод и использовать date()
вместо него, например:
$table->date('created_at');
$table->date('updated_at');
Комментарии:
1. Работает, но вы не должны изменять формат внутри вашей модели. Вы должны сделать это из своего представления: $post->created_at->format(‘Y-m-d’); Вы также можете изменить формат глобально для каждой даты, используя статический метод Carbon Carbon::setToStringFormat(‘Y-m-d’);
2.
Laravel
предоставляет удобный способ сделать это из model вместо того, чтобы использовать его в каждом представлении, здесь нет ничего плохого, но есть и другие способы, например: использованиеview presenter
класса.3. использование
public static $dates = ['updated_at', 'created_at'];
в вашей модели создаст эти поляCarbon
по умолчанию, поэтому внутри вашихgetXXXAttribute()
методов вы вводите толькоreturn $this->updated_at->format('Y-m-d')
4. Это зависит от модели. Интересно, существует ли глобальный (основанный на конфигурации) подход?
5. Это зависит от модели, но если у вас есть родительская модель, которая расширяет eloquent model, вы можете сделать это легко.
Ответ №2:
{{ $post->created_at }}
вернет ‘2014-06-26 04:07:31’
Решение таково
{{ $post->created_at->format('Y-m-d') }}
Комментарии:
1. Спасибо. для предоставления того, который работает в блейде. Должен был знать, что ошибка не была выдана при прямом использовании свойства из-за метода __toString .
2. Это форматирование дат по отдельности, но спрашивающий попросил изменить формат по умолчанию, а не для отдельного использования блейда.
Ответ №3:
Laravel 4.x и 5.0
Чтобы изменить время в базе данных, используйте: http://laravel.com/docs/4.2/eloquent#timestamps
Предоставление пользовательского формата временной метки
Если вы хотите настроить формат ваших временных меток, вы можете переопределить метод getDateFormat в вашей модели:
class User extends Eloquent {
protected function getDateFormat()
{
return 'U';
}
}
Laravel 5.1
https://laravel.com/docs/5.1/eloquent
Если вам нужно настроить формат ваших временных меток, установите свойство $DateFormat в вашей модели. Это свойство определяет, как атрибуты даты хранятся в базе данных, а также их формат, когда модель сериализуется в массив или JSON:
class Flight extends Model
{
/**
* The storage format of the model's date columns.
*
* @var string
*/
protected $dateFormat = 'U';
}
Комментарии:
1. Вы также можете просто установить
protected $dateFormat = 'U';
2. Я думаю, что это существует только в более новых версиях Laravel, но я обновлю ответ, чтобы отметить это.
3. В Laravel 5.6
$dateFormat
является общедоступным4. @Daniel Похоже, что он все еще защищен для меня: github.com/illuminate/database/blob/5.6/Eloquent/Concerns/… Можете ли вы указать, где это общедоступно?
5. @Loren laravel.com/docs/5.6/upgrade (
This getDateFormat method is now public instead of protected.
)
Ответ №4:
Вы также можете попробовать так.
Use CarbonCarbon;
$created_at = "2014-06-26 04:07:31";
$date = Carbon::parse($created_at);
echo $date->format("Y-m-d");
Ответ №5:
Вы могли бы использовать
protected $casts = [
'created_at' => "datetime:Y-m-dTH:iPZ",
];
в вашем классе модели
или в любом формате по этой ссылке https://www.php.net/manual/en/datetime.format.php
Ответ №6:
Если кто-то ищет простое решение в Laravel 5.3:
-
Пусть значение по умолчанию
timestamps()
будет сохранено как есть, т.е. ‘2016-11-14 12:19:49’ -
В ваших представлениях отформатируйте поле, как показано ниже (или по мере необходимости):
date('F d, Y', strtotime($list->created_at))
Ответ №7:
В laravel 6 последнюю версию можно легко добавить в «APP/user.php » модель:
/**
* The storage format of the model's date columns.
*
* @var string
*/
protected $dateFormat = 'U';
И в схеме можно добавить
$table->integer('created_at')->nullable();
$table->integer('updated_at')->nullable();
Ответ №8:
Используйте CarbonCarbon;
$targetDate = "2014-06-26 04:07:31";
Carbon::parse($targetDate)->format('Y-m-d');
Ответ №9:
Для новых версий laravel вам просто нужно объявить его в своей модели, например:
class Your_class_name extends Model {
protected $dateFormat = 'Y-m-d';
...
}
Ответ №10:
Самый простой способ — просто сделать это непосредственно в блейд-файле
$post->created_at->format('Y-m-d')
Ответ №11:
Кастинг — это правильный способ сделать это в Laravel 9 и независимо от вашего интерфейса; blade, vue, react… переменные будут обработаны должным образом.
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'created_at' => 'datetime:Y-m-d',
'updated_at' => 'datetime:Y-m-d',
'json' => 'object',
'active' => 'boolean',
];
Ответ №12:
LARAVEL 9 ^
в вашей модели добавьте это.
use CarbonCarbon;
protected $dates = ['created_at','updated_at'];
protected function serializeDate(DateTimeInterface $dates)
{
//return Carbon::createFromFormat('Y-m-d H:i:s', $dates)->diffForHumans();
OR
//return Carbon::createFromFormat('Y-m-d H:i:s', $dates)->format('Y-m-d');
}