场景
我一直在为自己的工作场所构建一个应用程序,但不幸的是,在创建此应用程序时,我并不是最能被了解的开发人员。我一直在用“日期”字段将费用数据存储在数据库中,但此日期字段本质上是一个字符串,我无法将其与任何Carbon
日期时间进行比较。
示例
示例结果如下['name' => 'Spend', 'amount' => 22.25, 'date' => '2018-01-12']
所示。因此,如果我想从昨天提取所有支出,这是我目前使用的代码:
public function getBetween($from, $to)
{
$all = $this->getAll();
foreach($all as $key => $revenue)
{
// dateRepositorys convert to carbon method converts the date to carbon
// but this is converting the date AFTER the expensive query has been ran
if($this->dateRepository->convertToCarbon($revenue->date) < $from || $this->dateRepository->convertToCarbon($revenue->date) > $to)
{
$all->forget($key);
}
}
return $all;
}
这很好用,但是它要求很高,因为它运行了几次以获取利润概览。我试图遵循更好的编码实践,最终将重写代码并将日期字段添加到日期列表中,如下所示:https://laravel.com/docs/5.8/eloquent-mutators#date-mutators,但暂时我想知道是否可行。
问题
使用雄辩的查询从数据库中获取数据时,我可以进行某种预格式化吗?例如:
Expense::whereBetween(Carbon::parse('date') <-- /* turn the date field into a carbon object BEFORE performing any checks */, [Carbon::yesterday(), Carbon::yesterday()])->get()
注释
我知道我可以做Carbon::yesterday()->format('Y-m-d')
,但是这意味着我失去了很多Carbon函数,因为我基本上只将其与字符串进行比较。
我确实知道日期变数器存在,但据我所知,它们仅在检索到数据后才起作用。
谢谢。
答案 0 :(得分:0)
您可以尝试投射自己的领域。将此代码插入模型。
protected $casts = [
'date' => 'date:Y-m-d',
]