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

如何用jQuery Ajax验证日期重复并修改Symfony控制器实现数据库查重

日期组合校验实现方案

1. 改造控制器的createProperty方法

在原有方法中添加Ajax校验分支,处理前端传来的日期参数并查询数据库:

// src/Controller/PropertyController.php
use Symfony\Component\HttpFoundation\JsonResponse;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;

// ...

public function createProperty(Request $request, EntityManagerInterface $em): Response
{
    $property = new Property();
    $form = $this->createForm(PropertyType::class, $property);
    $form->handleRequest($request);

    // 处理Ajax日期校验请求
    if ($request->isXmlHttpRequest() && $request->query->has('startDate') && $request->query->has('endDate')) {
        // 解析并验证日期格式(根据前端实际格式调整,这里假设为Y-m-d)
        $startDate = \DateTime::createFromFormat('Y-m-d', $request->query->get('startDate'));
        $endDate = \DateTime::createFromFormat('Y-m-d', $request->query->get('endDate'));

        if (!$startDate || !$endDate) {
            return new JsonResponse(['exists' => false, 'error' => '无效的日期格式'], 400);
        }

        // 查询数据库中是否存在相同的startDate和endDate组合
        $existing = $em->getRepository(Property::class)->findOneBy([
            'startDate' => $startDate,
            'endDate' => $endDate,
        ]);

        // 返回JSON结果告知前端是否存在
        return new JsonResponse(['exists' => $existing !== null]);
    }

    // 原有表单提交逻辑保持不变
    if ($form->isSubmitted() && $form->isValid()) {
        $em->persist($property);
        $em->flush();

        return $this->redirectToRoute('property_index');
    }

    return $this->render('property/new.html.twig', [
        'property' => $property,
        'form' => $form->createView(),
    ]);
}

2. 确保路由支持GET请求

修改路由配置,允许GET请求以适配Ajax校验:

# config/routes.yaml
property_create:
    path: /property/new
    controller: App\Controller\PropertyController::createProperty
    methods: [GET, POST]

3. 前端添加Ajax校验与模态框逻辑

在Twig视图中拦截提交事件,先发起Ajax校验,再根据结果处理:

{# templates/property/new.html.twig #}
{% extends 'base.html.twig' %}

{% block body %}
    <h1>创建Property</h1>

    {{ form_start(form) }}
        {{ form_widget(form) }}
        <button type="button" id="submit-property">提交</button>
    {{ form_end(form) }}

    <!-- 日期重复提示模态框 -->
    <div class="modal" id="date-duplicate-modal" tabindex="-1">
        <div class="modal-dialog">
            <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title">提示</h5>
                    <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                </div>
                <div class="modal-body">
                    <p>所选的日期组合已存在,请重新选择!</p>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">确定</button>
                </div>
            </div>
        </div>
    </div>

    <script>
        document.addEventListener('DOMContentLoaded', function() {
            const submitBtn = document.getElementById('submit-property');
            const form = document.querySelector('form');
            const startDateInput = document.getElementById('property_startDate'); // 替换为你的实际字段ID
            const endDateInput = document.getElementById('property_endDate'); // 替换为你的实际字段ID
            const modal = new bootstrap.Modal(document.getElementById('date-duplicate-modal'));

            submitBtn.addEventListener('click', function(e) {
                e.preventDefault();

                const startDate = startDateInput.value;
                const endDate = endDateInput.value;

                // 发起Ajax请求
                fetch('{{ path('property_create') }}?' + new URLSearchParams({
                    startDate: startDate,
                    endDate: endDate
                }))
                .then(response => response.json())
                .then(data => {
                    if (data.exists) {
                        // 弹出提示模态框
                        modal.show();
                    } else {
                        // 日期合法,提交表单
                        form.submit();
                    }
                })
                .catch(err => {
                    alert('日期校验失败,请稍后重试');
                });
            });
        });
    </script>
{% endblock %}

关键注意点

  • 替换代码中的字段ID:property_startDate和property_endDate要与表单生成的实际ID一致,可通过浏览器审查元素查看
  • 日期格式要前后端统一:如果前端使用其他格式(如d/m/Y),需修改控制器中createFromFormat的参数
  • 若需校验日期重叠而非完全相等,可修改Repository查询逻辑,使用DQL编写日期范围匹配条件

内容的提问来源于stack exchange,提问作者learner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:05:12