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

如何在Laravel中用Ajax结合复选框实现优惠日期筛选及参数传递?

没问题,我来帮你一步步实现这个日期筛选功能~咱们分前端和后端两部分来搞,先把你的HTML补全,再写Ajax逻辑,最后处理Laravel后端的查询。

1. 完善你的HTML复选框结构

先把你提供的面板内容补全,在折叠面板里加上三个对应日期选项的复选框,给它们统一类名方便JS获取,同时把参数值里的空格去掉(避免传递时的潜在问题):

<div class="panel panel-default panel-faq">
    <!-- panel-heading -->
    <div class="panel-heading">
        <div class="panel-title">
            <a data-toggle="collapse" data-parent="#accordion" href="#accordion-two">
                <h4>Date Posted <span class="pull-right"><i class="fa fa-plus"></i></span></h4>
            </a>
        </div>
    </div>
    <!-- panel-collapse -->
    <div id="accordion-two" class="panel-collapse collapse">
        <div class="panel-body">
            <div class="checkbox">
                <label>
                    <input type="checkbox" class="date-filter-checkbox" value="today"> Today
                </label>
            </div>
            <div class="checkbox">
                <label>
                    <input type="checkbox" class="date-filter-checkbox" value="7days"> Last 7 Days
                </label>
            </div>
            <div class="checkbox">
                <label>
                    <input type="checkbox" class="date-filter-checkbox" value="30days"> Last 30 Days
                </label>
            </div>
            <button id="apply-date-filter" class="btn btn-primary mt-2">Apply Filter</button>
        </div>
    </div>
</div>
2. 编写Ajax请求逻辑

用jQuery写监听逻辑(Laravel项目一般都集成了jQuery,要是用原生JS也可以调整),收集选中的参数后发送请求到后端:

$(document).ready(function() {
    // 监听筛选按钮点击
    $('#apply-date-filter').click(function() {
        // 收集所有选中的复选框值
        let selectedDates = [];
        $('.date-filter-checkbox:checked').each(function() {
            selectedDates.push($(this).val());
        });

        // 无选中项时提示用户
        if (selectedDates.length === 0) {
            alert('Please select at least one date filter!');
            return;
        }

        // 发送Ajax请求
        $.ajax({
            url: '{{ route("offers.filterByDate") }}', // 对应你的Laravel路由名称
            type: 'POST',
            data: {
                _token: '{{ csrf_token() }}', // Laravel必填的CSRF令牌
                date_filters: selectedDates
            },
            success: function(response) {
                // 更新页面上的优惠列表(假设列表容器是#offers-list)
                $('#offers-list').empty();
                $.each(response.offers, function(index, offer) {
                    let offerHtml = `<div class="offer-item">
                        <h5>${offer.title}</h5>
                        <p>Posted: ${offer.created_at}</p>
                        <p>${offer.description}</p>
                    </div>`;
                    $('#offers-list').append(offerHtml);
                });
            },
            error: function(xhr) {
                console.error('Error loading offers:', xhr.responseText);
                alert('Failed to load offers. Try again later.');
            }
        });
    });

    // 可选:实时监听复选框变化,自动触发筛选
    $('.date-filter-checkbox').change(function() {
        $('#apply-date-filter').click();
    });
});
3. Laravel后端处理

第一步:定义路由

在routes/web.php里添加POST路由:

use App\Http\Controllers\OfferController;

Route::post('/offers/filter-by-date', [OfferController::class, 'filterByDate'])->name('offers.filterByDate');

第二步:控制器逻辑处理

在OfferController.php里编写方法,把前端参数转换成数据库查询条件:

<?php

namespace App\Http\Controllers;

use App\Models\Offer;
use Carbon\Carbon;
use Illuminate\Http\Request;

class OfferController extends Controller
{
    public function filterByDate(Request $request)
    {
        // 验证请求参数合法性
        $request->validate([
            'date_filters' => 'required|array',
            'date_filters.*' => 'in:today,7days,30days'
        ]);

        $dateFilters = $request->input('date_filters');
        $query = Offer::query();

        // 根据选中的条件添加查询约束(用orWhere实现多条件“或”逻辑)
        foreach ($dateFilters as $filter) {
            switch ($filter) {
                case 'today':
                    $query->orWhereDate('created_at', Carbon::today());
                    break;
                case '7days':
                    $query->orWhere('created_at', '>=', Carbon::now()->subDays(7));
                    break;
                case '30days':
                    $query->orWhere('created_at', '>=', Carbon::now()->subDays(30));
                    break;
            }
        }

        // 获取结果并返回JSON
        $offers = $query->get();
        return response()->json([
            'success' => true,
            'offers' => $offers
        ]);
    }
}

小提示:

  • 假设你的优惠模型是Offer,创建时间字段是created_at,如果字段或模型名不同记得修改
  • 如果需要多条件“且”逻辑,把orWhere换成where即可
  • Laravel默认集成了Carbon,处理日期非常方便,不用额外安装

这样一套流程下来,就能实现复选框选择日期参数、Ajax传递、后端查询并更新页面的完整功能啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:31:57