雄辩的查询期间编辑字段Laravel

时间:2019-06-10 07:23:24

标签: php laravel eloquent

场景

我一直在为自己的工作场所构建一个应用程序,但不幸的是,在创建此应用程序时,我并不是最能被了解的开发人员。我一直在用“日期​​”字段将费用数据存储在数据库中,但此日期字段本质上是一个字符串,我无法将其与任何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函数,因为我基本上只将其与字符串进行比较。

我确实知道日期变数器存在,但据我所知,它们仅在检索到数据后才起作用。

谢谢。

1 个答案:

答案 0 :(得分:0)

您可以尝试投射自己的领域。将此代码插入模型。

protected $casts = [
    'date'  => 'date:Y-m-d',
]