使用雄辩的whereMonth进行查询,其中date是字符串

时间:2019-07-17 22:55:17

标签: laravel postgresql casting eloquent

在其中一个表中,类型为varchar的列包含日期,格式为day-month-year。我想在带有whereYearwhereMonth的表上使用雄辩的语句运行查询,但是由于列booking_date的类型不是Date,所以我收到一个错误。

我要运行的查询是

MyTable::whereYear('booking_date', '=', $year)
        ->whereMonth('booking_date', '=', $month)
        ->get();

并出现以下错误

"SQLSTATE[42883]: Undefined function: 7 ERROR:  function pg_catalog.date_part(unknown, character varying) does not exist\nLINE 1: ...\" = $1 and \"said_table\".\"deleted_at\" is null) and extract(ye...\n                                                             ^\nHINT:  No function matches the given name and argument types. You might need to add explicit type casts.

有没有办法在查询之前将字符串值转换为日期,也许可以使用原始表达式?如果是的话,任何提示都会很棒。

2 个答案:

答案 0 :(得分:1)

如果此字段将一直是特定模型上的日期(并且名称很可能是'booking_date',那肯定比在每个查询中都要处理它要容易得多)。您可以在模型本身的日期字段中投射它:

protected $dates = [
    'booking_date',
];

默认情况下,Eloquent将把created_at和updated_at列转换为Carbon的实例,并且上面的操作与booking_date相同。无需进一步铸造。来自Laravel docs on date mutators

答案 1 :(得分:0)

借助Laravel中包含的Carbon库,您可以轻松实现这一目标:

use Carbon\Carbon;
$targetDate = Carbon::now()->year($year)->month($month);
MyTable::whereYear('booking_date', '=', $targetDate)
        ->whereMonth('booking_date', '=', $targetDate)
        ->get();