在其中一个表中,类型为varchar
的列包含日期,格式为day-month-year
。我想在带有whereYear
和whereMonth
的表上使用雄辩的语句运行查询,但是由于列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.
有没有办法在查询之前将字符串值转换为日期,也许可以使用原始表达式?如果是的话,任何提示都会很棒。
答案 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();