【发布时间】:2019-06-10 07:23:24
【问题描述】:
场景
我一直在为我的工作场所构建应用程序,不幸的是,在创建此应用程序时我并不是最有见识的开发人员。我一直在使用“日期”字段将费用数据存储在数据库中,但这个日期字段本质上是一个字符串,我无法将任何 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,但目前我想知道这是否可能。
问题
我可以在使用 eloquent 查询从数据库中获取数据时进行某种预格式化吗?比如:
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'),但这意味着我失去了很多碳功能,因为我基本上只会与字符串进行比较。
我确实知道存在日期修改器,但据我所知,它们仅在检索数据后才起作用。
提前谢谢你。
【问题讨论】: