Laravel приводит установленный формат даты не работает

#laravel

#ларавель

Вопрос:

столкнулся с такой проблемой. Существует модель бронирования. В бронировании есть поля time_from и time_to. Когда я вызываю какое-то бронирование, хочу, чтобы формат был другим. Пробовал использовать $casts = [‘time_from’ => ‘datetime:m-d-Y’]; не работает! В чем может быть проблема???

Модель

 class Booking extends Model
{
    use HasFactory;
    protected $casts = [
        'time_from' => 'datetime:m-d-Y',
        'time_to' =>  'datetime:m-d-Y'
    ];
    protected $dateFormat = 'm-d-y';
    protected $fillable = [
        'room_id',
        'time_from',
        'time_to',
        'first_name',
        'last_name',
        'phone',
        'email',
        'special_requirements',
        'when_wait_you',
    ];

    public function room(){
        return $this->belongsTo(Room::class);
    }
}
 

Миграция

     public function up()
    {
        Schema::create('bookings', function (Blueprint $table) {
            $table->id();
            $table->bigInteger('room_id');
            $table->dateTime('time_from');
            $table->dateTime('time_to');
            $table->string('first_name');
            $table->string('last_name');
            $table->string('phone');
            $table->string('email');
            $table->text('special_requirements')->nullable();
            $table->string('when_wait_you')->nullable();
            $table->timestamps();
        });
    }
 

Результат

введите описание изображения здесь

Комментарии:

1. что «не работает»?…..

2. time_from и time_to форматируют не m-d-Y. Приведения не работают

3. хорошо, где вы сериализуете модель? в противном случае вы не сможете подтвердить, работает он или нет

4. я получаю от контроллера первое бронирование, но атрибуты time_from и time_to не работают с форматом приведения.

5. откуда вы знаете, что они «не работают»? вы сериализовали модель?

Ответ №1:

Приведение выполняется при преобразовании модели в формат массива или json.

 class Booking extends Model
{
    use HasFactory;
    protected $casts = [
        'time_from' => 'datetime:m-d-Y',
    ];
}
 
 AppModelsBooking::first()->time_from

=> IlluminateSupportCarbon { ... }
 
 AppModelsBooking::first()->toArray()['time_from'] 

=> '01-02-2021'
 
 AppModelsBooking::first()->toJson()

=> "{... "time_from":"01-02-2021", ....}"
 

Комментарии:

1. В любом случае, на моем laravel 8.x он даже не изменяет time_from на carbon, что-то не так с моим проектом, я имею в виду, что я сделал так же, как и ваш, просто другой столбец. Я попробовал dd($data->time_from) , и он возвращает строку, а не дату, но он работает на tinker как дата, но только при прямом использовании Models::find($id)->time_from

2. Спасибо! Я понимаю, что ошибка. Я забыл сериализовать свои данные. toArray или toJSON()

3. Это все еще не работает для меня. Сериализация происходит через JsonResource. Использование Laravel 8. Если я вручную получу доступ к модели и преобразоваю ее в массив с помощью toArray(), она работает так, как ожидалось (я получаю отформатированную дату). Но этого не происходит с использованием коллекции JsonResource: MyJsonResource::collection($query-> get()) Я не могу поверить, что никто этого не заметил.

4. @John Smith Я думаю, что это работает так, как задумано. $casts предназначен для сериализации ( toArray или toJson ). Ресурсы Api разные. Вы должны четко указывать, что они возвращают.

5. Не могли бы вы привести мне пример, как я могу извлечь из этого выгоду? Почему мне нужно преобразовать в массив, чтобы использовать данные, подлежащие кастингу? Большую часть времени я взаимодействую с фактическими свойствами экземпляра модели, в этом случае мне нужно использовать вспомогательные средства для преобразования каждого свойства?