【问题标题】:Edit field during eloquent query Laravel在 eloquent 查询 Laravel 期间编辑字段
【发布时间】: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') &lt;-- /* turn the date field into a carbon object BEFORE performing any checks */, [Carbon::yesterday(), Carbon::yesterday()])-&gt;get()

备注

我知道我可以做到Carbon::yesterday()-&gt;format('Y-m-d'),但这意味着我失去了很多碳功能,因为我基本上只会与字符串进行比较。

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

提前谢谢你。

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-11
      • 2014-09-28
      • 2017-10-22
      • 2015-02-22
      • 2017-06-05
      • 1970-01-01
      相关资源
      最近更新 更多