【问题标题】:Laravel - Date range search filter not workingLaravel - 日期范围搜索过滤器不起作用
【发布时间】:2019-10-20 13:38:52
【问题描述】:

我正在尝试执行不同的搜索过滤器:用户名、电子邮件和日期范围。除日期搜索外,所有其他搜索过滤器均正常工作。

控制器

public function revenueDetail(Request $request, $plan = null)
{
    $data['title'] = 'Revenue Detail Report';
    $revenuedetails = DB::table("users")
        ->select("users.username", "users.email",DB::raw("DATE(users.created_at) as subscription_date"))
        ->where('users.plan', self::$type[$plan] ?? null); // ?? will escape exception if $plan is null
        $render=[];
        if(isset($request->start_date) && isset($request->end_date))
        {
            $revenuedetails=$revenuedetails->whereBetween('created_at',[$request->start_date,$request->end_date]);
            $render['start_date']=$request->start_date;
            $render['end_date']=$request->end_date;
        }elseif(isset($request->start_date))
        {
            $revenuedetails=$revenuedetails->where('created_at',$request->start_date);
            $render['start_date']=$request->start_date;
        }        
        if(isset($request->username))
        {
            $revenuedetails=$revenuedetails->where('username','like','%'.$request->username.'%');
            $render['username']=$request->username;
        }
        if(isset($request->email))
        {
            $revenuedetails=$revenuedetails->where('email','like','%'.$request->email.'%');
            $render['email']=$request->email;
        }        
        $revenuedetails= $revenuedetails->orderBy('subscription_date','DESC');
        $revenuedetails= $revenuedetails->paginate(15);
        $revenuedetails= $revenuedetails->appends($render);
        $data['revenuedetails'] = $revenuedetails;
    return view('revenue.revenueDetail',$data);
}   

查看

    <div class="row" style="margin-bottom: 10px">
        {{ Form::model(request(),['method'=>'get']) }}
        <div class="col-sm-2">
             {{ Form::text('username',null,['class'=>'form-control','placeholder'=>'Username']) }}
        </div>
        <div class="col-sm-2">
            {{ Form::text('email',null,['class'=>'form-control','placeholder'=>'Email']) }}
        </div>
        <div class="col-sm-3">
            {{ Form::date('start_date',null,['class'=>'form-control','placeholder'=>'Date']) }}
        </div>  
        <div class="col-sm-3">
            {{ Form::date('end_date',null,['class'=>'form-control','placeholder'=>'Date']) }}
        </div>        
        <div class="col-xs-2">
            {{ Form::submit('Search',['class'=>'btn btn-warning']) }}
            <a href="{{ route('gamesexport') }}" class="btn btn-primary"><i class="fa fa-file-excel-o"></i> Excel</a>
        </div>
        {{ Form::close() }}
    </div>


    <tbody>
        @foreach($revenuedetails as $key => $revenuedetail)
            <tr>
                <td>{{ ++$key }}</td>
                <td>{{ $revenuedetail->username }}</td>
                <td>{{ $revenuedetail->email }}</td>
                <td>{{ $revenuedetail->subscription_date }}</td>
            </tr>

        @endforeach
            <tr>
            <td colspan="8">
                {{ $revenuedetails->links() }}
            </td>
            </tr>         
    </tbody>

当我点击搜索按钮时,我希望看到正在显示的结果。除日期搜索过滤器外,所有其他搜索过滤器都在工作。它不显示任何结果。

  1. 如何让它发挥作用

  2. 如何将日期格式化为 dd/mm/yyyy

谢谢。

【问题讨论】:

  • 我看不出任何看起来有问题的副手,但是当我试图让过滤器正常工作时,我通常的策略是先手动编写我想要的 SQL(在你的情况下很直接 - forward) 然后记录生成的 SQL 语句并继续处理它,直到我正确为止: Log::info('User:' . Auth::user()->id . ' - ' . $query->toSql ());
  • 我也不懂。它只是日期过滤器
  • 如果您记录 $revenuedetails->toSql() 您将看到正在生成的 sql 并且您会知道它为什么不起作用。

标签: laravel eloquent


【解决方案1】:

如果您没有将 $request->start_date 作为Y-m-d H:i:s 格式,您可能需要将其转换为该格式,并且如果您只是传递日期,即 Ymd 并希望在您的 where 查询中进行比较应该是

$start_date = Carbon\Carbon::parse($request->start_date)->toDateTimeString()
$end_date = Carbon\Carbon::parse($request->end_date)->toDateTimeString()
$revenuedetails=$revenuedetails->whereBetween('created_at',[$start_date, $end_date]);

【讨论】:

  • 我按照你说的做了,但是得到了这个错误:“SQLSTATE[42S22]: Column not found: 1054 Unknown column '2019-06-05T08:22:17+00:00Wed, 05 Jun 2019 08 :22:17 +0000UTCam30UTC05_am30' in 'where 子句' (SQL: select count(*) as aggregate from users where users.plan = 1 and 2019-06-05T08:22:17+00:00Wed, 05 Jun 2019 08:22:17 +0000UTCam30UTC05_am30 在 2019-05-27 和 2019-06 之间-05) "
  • 使用 tablename.created_at 而不是仅 created_at
  • 错误依然存在。使用 users.created_at 后
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 2014-11-02
  • 2021-08-12
相关资源
最近更新 更多