#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. Не могли бы вы привести мне пример, как я могу извлечь из этого выгоду? Почему мне нужно преобразовать в массив, чтобы использовать данные, подлежащие кастингу? Большую часть времени я взаимодействую с фактическими свойствами экземпляра модели, в этом случае мне нужно использовать вспомогательные средства для преобразования каждого свойства?