VueJS与Laravel间DateTime值无法存入数据表的技术问询
解决VueJS与Laravel DateTime值无法存储到数据表的问题
核心问题分析
从你提供的Payload和代码来看,主要问题集中在字段名不匹配、Laravel模型批量赋值限制、日期格式未正确转换这三个方面:
- Payload中的字段名(如
permissions_start_date)与数据库迁移定义的字段名(如permission_start_date)多了一个s,导致数据无法对应存入 - Laravel模型未配置可填充字段,
fill()方法无法批量赋值日期字段 - 前端传入的ISO格式日期字符串未转换为Laravel/数据库支持的格式
分步解决方案
1. 统一前后端字段名
Payload中的字段名带s(如permissions_start_date),但数据库迁移和模型字段是不带s的permission_start_date,必须统一:
- 修改Vue模板中的v-model绑定,去掉字段名的
s:
<!-- 修正前 --> <app-input v-model="inputs.permissions_start_date" ... /> <!-- 修正后 --> <app-input v-model="inputs.permission_start_date" ... />
对应所有日期时间字段:permissions_end_date→permission_end_date、permissions_start_time→permission_start_time、permissions_end_time→permission_end_time
2. 配置Laravel模型可填充字段
在App\Models\Tdhpermissions模型中添加$fillable属性,允许批量赋值所有需要存储的字段:
<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Carbon\Carbon; class Tdhpermissions extends Model { // 指定可批量赋值的字段 protected $fillable = [ 'permission_date', 'permission_start_date', 'permission_end_date', 'permission_start_time', 'permission_end_time', 'justification', 'is_active', 'is_approve' ]; // 自动转换前端传入的ISO日期为数据库格式 public function setPermissionDateAttribute($value) { $this->attributes['permission_date'] = Carbon::parse($value)->format('Y-m-d'); } public function setPermissionStartDateAttribute($value) { $this->attributes['permission_start_date'] = Carbon::parse($value)->format('Y-m-d H:i:s'); } public function setPermissionEndDateAttribute($value) { $this->attributes['permission_end_date'] = Carbon::parse($value)->format('Y-m-d H:i:s'); } }
3. 修正数据库迁移字段类型
时间字段不需要用dateTime类型,改用time更合理,同时确保字段名正确:
// 推荐的迁移代码 $table->date("permission_date"); $table->dateTime("permission_start_date"); $table->dateTime("permission_end_date"); $table->time("permission_start_time"); // 仅存储时间 $table->time("permission_end_time"); // 仅存储时间 $table->string("justification");
4. 调整Service层的save方法
确保BaseService的save方法正确接收并处理请求数据:
// 在App\Services\Core\BaseService中 public function save($data = []) { $model = $this->model->fill($data ?: request()->all()); $model->save(); return $model; }
5. 控制器中显式处理日期(可选)
如果不想用模型mutator,也可以在控制器的store和update方法中直接转换日期:
public function store() { $requestData = request()->all(); // 转换日期格式 $dateFields = ['permission_date', 'permission_start_date', 'permission_end_date']; foreach ($dateFields as $field) { if (isset($requestData[$field])) { $requestData[$field] = $this->createDateTime($requestData[$field]); } } $data = $this->tdhpermissionsService->save($requestData); return created_responses('data', ['message' => 'Creacion de registro exitosa', 'data' => $data]); }
内容的提问来源于stack exchange,提问作者Trinky
相关产品推荐
相关产品推荐

