You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

VueJS与Laravel间DateTime值无法存入数据表的技术问询

解决VueJS与Laravel DateTime值无法存储到数据表的问题

核心问题分析

从你提供的Payload和代码来看,主要问题集中在字段名不匹配、Laravel模型批量赋值限制、日期格式未正确转换这三个方面:

  1. Payload中的字段名(如permissions_start_date)与数据库迁移定义的字段名(如permission_start_date)多了一个s,导致数据无法对应存入
  2. Laravel模型未配置可填充字段,fill()方法无法批量赋值日期字段
  3. 前端传入的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 10:18:09