【问题标题】:Date Time range search in Laravel 5.6Laravel 5.6 中的日期时间范围搜索
【发布时间】:2019-02-01 17:00:50
【问题描述】:

我正在表格中显示我的数据。我的故事中有一个登录时间。现在我想过滤两个日期之间的数据。我从日期和日期添加了 jquery 日期时间选择器。但是我很困惑只将日期范围数据显示到同一个表中,默认情况下显示所有数据。谁能建议我使用模型视图和控制器进行日期范围过滤的确切方法?

日期范围输入

<div class="col-md-4">
<div class="input-group date form_meridian_datetime" data-date="2012-12-21T15:25:00Z">
    <input type="text" placeholder="from" name="from" id="from" size="16" class="form-control">
    <span class="input-group-btn">
        <button class="btn default date-reset" type="button">
        <i class="fa fa-times"></i>
        </button>
        <button class="btn default date-set" type="button">
        <i class="fa fa-calendar"></i>
        </button>
    </span>
</div>

表格

<table class="table table-striped table-bordered table-hover" id="sample_3">
        <thead>
            <tr>
                <th> Permit Taker </th>
                <th> Permit By </th>
                <th> Permit Types </th>
                <th> Purpose </th>
                <th> Entry Date &Time </th>
                <th> Exit Date & Time </th>
                <th> SignIn </th>
                <th> SignOut </th>
                <th> Edit </th>
                <th> Delete </th>
            </tr>
        </thead>
        <tbody>
            @foreach($internalVisitors as $internalVisitor)
            <tr>
                <td> {{ $internalVisitor->internalHosts->hostName }} </td>
                <td> {{ $internalVisitor->permitBy}} </td>
                <td> {{ $internalVisitor->permitType}} </td>
                <td> {{ $internalVisitor->purpose}} </td>
                <td> {{ $internalVisitor->startDate}} </td>
                <td> {{ $internalVisitor->endDate}} </td>

                <td>
                    @if ( $internalVisitor-> signIn === 1)
                    <span >{{ $internalVisitor->signInTime}}</span>
                    @else
                    <form method="post" action="{{route('signInUpdate','id')}}">
                        {{ csrf_field()}}
                        <input type="hidden" name="isSignIn" value="{{$internalVisitor->isSignIn}}"/>
                        <input type="hidden" name="tableId" value="{{$internalVisitor->id}}"/>
                        <button type="submit">
                        <a >Sign In</a></button>

                    </form>
                    @endif
                </td>
                <td>

                    @if( $internalVisitor->signIn === 0)
                    <span>Not SignIn</span>

                    @elseif ($internalVisitor-> signIn === 1 && $internalVisitor->signOut === 1)
                    <span>{{ $internalVisitor->signOutTime}}</span>
                    @elseif($internalVisitor-> signIn === 1 && $internalVisitor->signOut === 0 )
                    <form method="post" action="{{route('signOutUpdate','id')}}">
                        {{ csrf_field()}}
                        <input type="hidden" name="signOut" value="{{$internalVisitor->signOut}}"/>
                        <input type="hidden" name="tableId" value="{{$internalVisitor->id}}"/>
                        <button type="submit">

                    </form>
                    <a >Sign Out</a></button>

                    @endif
                </td>
                <td class=""><a class="btn btn-raised btn-primary btn-sm" href="{{ route('iVisitorEdit',
                $internalVisitor->id) }}"><i class="fa fa-pencil-square-o" aria-hidden="true"></i></a>
            </td>
            <td>
                <form method="POST" id="delete-form-{{ $internalVisitor->id }}" action="{{ route('iVisitorDelete',$internalVisitor->id) }}" style="display: none;">
                    {{ csrf_field() }}
                    {{ method_field('delete') }}

                </form>

                <button onclick="if(confirm('Are you Sure, You went to delete this?')){
                event.preventDefault();
                document.getElementById('delete-form-{{ $internalVisitor->id }}').submit();
                }else{
                event.preventDefault();
                }" class="btn btn-raised btn-danger btn-sm"><i class="fa fa-trash-o" aria-hidden="true"></i></button>
            </td>

        </tr>
        @endforeach


    </tbody>
</table>

控制器

if (request()->has('from') && request()->has('to')) {
        $from = request()->get('from')->date('Y-m-d' . ' 00:00:00', time()); 
        $to = request()->get('to')->date('Y-m-d' . ' 00:00:00', time()); 

        $leads = InternalVisitor::whereBetween('signInTime', [$from, $to])->paginate(5);
        dd($leads);

    }

脚本

    <script>
$(document).ready(function(){
    $.datepicker.setDefaults({
        dateFormat: 'Y-m-d H:i:s'
    });
    $(function(){
        $("#From").datepicker();
        $("#to").datepicker();
    });
    $('#range').click(function(){
        var From = $('#From').val();
        var to = $('#to').val();
        if(From != '' && to != '')
        {
            $.ajax({
                url: '{{route('internalVisitor')}}',
                method:"POST",
                data:{From:From, to:to},
                success:function(data)
                {
                    $('#sample_3').html(data);
                }
            });
        }
        else
        {
            alert("Please Select the Date");
        }
    });
});
</script>

【问题讨论】:

    标签: jquery html laravel


    【解决方案1】:

    您需要将from-to 范围拆分为两个单独的where 条件:

    use Carbon\Carbon;
    
    ...
    
    $query = InternalVisitor::query();
    
    if (request()->has('from')) {
        $from = Carbon::parse(request()->get('from'))->format('Y-m-d') . ' 00:00:00'; 
        $query->where('signInTime', '>=', $from);
    }
    
    if (request()->has('to')) {
        $to = Carbon::parse(request()->get('to'))->format('Y-m-d') . ' 23:59:59';
        $query->where('signInTime', '<=', $from);
    }
    
    $leads = $query->paginate(5);
    

    【讨论】:

    • 现在显示“FatalThrowableError (E_ERROR) Call to a member function date() on string”
    • 我只是复制粘贴了您的代码,假设它可以正常工作。您可以使用Carbon 解析传入的字符串日期时间值。我更新了答案。
    • 我使用了 Carbon,但它显示“DateTime::__construct(): 无法在位置 15 (-) 解析时间字符串(2018 年 8 月 27 日 - 下午 5:28):意外字符”跨度>
    • 现在我查看了您的代码,您的日期时间选择器使用“Y-m-d H:i:s”格式,因此您可以直接将其输入到您的查询中:$query-&gt;where('signInTime', '&gt;=', request()-&gt;get('from'));
    猜你喜欢
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多