在 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 以了解它应如何以原始方式响应。
我正在尝试从使用日期作为排序列的范围中选取一组数据。但问题是我的 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 以了解它应如何以原始方式响应。