在 where 查询 Laravel 5.2 中将 varchar 转换为日期

Casting varchar to date in where query Laravel 5.2

我正在尝试从使用日期作为排序列的范围中选取一组数据。但问题是我的 table 中的日期被保存为 varchar 字符串。

注意:varchar 字段类型需要保留在某些非 laravel 遗留代码库中使用的状态,如果更改为日期类型,我将中断服务。

我试过投射,但没用。

这是控制器中的代码

        switch ($range) {
        case 'thisWeek':
            $start = Carbon::now()->startOfWeek()->format('d-m-y');
            $end = Carbon::now()->endOfWeek()->format('d-m-Y');     
            break;

        case 'thisMonth':
            $start = Carbon::now()->startOfMonth()->format('d-m-Y');
            $end = Carbon::now()->endOfMonth()->format('d-m-Y');
            // dd($start, $end);
            break;


        case 'last90Days':
            $start = Carbon::now()->format('d-m-Y');
            $end = Carbon::now()->subDays(90)->format('d-m-Y');

            // dd($start, $end);
            break;

        case 'last30Days':
            $start = Carbon::now()->format('d-m-Y');
            $end = Carbon::now()->subDays(30)->format('d-m-Y');
            break;


        case 'year':
            $start = Carbon::now()->format('d-m-Y');
            $end = Carbon::now()->year;
            $end = "31-12-". $end;
            break;

        // case 'all':
        //  $route = $name .".". "index";
        //  return redirect()->Route($route);

        default:
            session()->flash("alert-danger", "no range selected");
            return redirect()->back();
            break;
    }

    if($name=="activitylog"){

        // return $start . ' <br>' . $end;

        $logs = Payment::where("payDate", '<', $start)->where("payDate", ">", $end)->
                        orderBy("payDate", "DESC")->
                        paginate(20);
    }
    else{
        $logs = Payment::where("description", $description[$name])->
                    where("payDate", '=<', $start)->where("payDate", ">=", $end)->
                    orderBy("payDate", "DESC")->
                    paginate(20);   

模特:

<?php

namespace App\Models\Admin;

use Illuminate\Database\Eloquent\Model;

class Payment extends Model
{
    protected $table = "payments";
    public $timestamps = false;
    protected $cast = ["payDate"=> "DATE"];
}

当用户请求我希望比较的任何范围并给出答案时。

上面是数据库配置的图片 和下面的结构

您将不得不使用 mysql 的 STR_TO_DATE 功能。

您要查找的原始 SQL 查询是:

查看实际效果:http://sqlfiddle.com/#!9/a40090/8

select * from `test` where str_to_date(`payDate`, '%d-%m-%Y') > str_to_date('31-12-2007', '%d-%m-%Y');

使用 STR_TO_DATE 你可以告诉 MySQL 日期的格式,这有助于 MySQL 返回正确的日期进行排序等。

您的 Eloquent 查询将看起来像这样:

 /** put it like this so we don't have to repeat it everywhere where needed **/
 $paydate_raw = DB::raw("STR_TO_DATE(`payDate`, '%d-%m-%Y')");

 /** encoding the raw query. the ? is populated by setBindings() **/
 $start_raw = DB::raw("STR_TO_DATE(?, '%d-%m-%Y')");
 $end_raw = DB::raw("STR_TO_DATE(?, '%d-%m-%Y')");


  $query = Payment::where($paydate_raw, '<', $start_raw)->where($paydate_raw, ">", $end_raw)->
                    orderBy('paydate', "DESC")->
                    setBindings([$start, $end])->
                    paginate(20);
  // debugging output.
  //echo $query->toSql();

注意上面的代码只是一个概念,我还没有测试过,但应该可以。另请查看 SQL fiddle 以了解它应如何以原始方式响应。