Сценарий
Я создавал приложение для своего рабочего места, к сожалению, на момент создания этого приложения я не был самым знающим разработчиком. Я хранил данные о расходах в базе данных с полем «дата», но это поле даты по сути является строкой, с которой я не могу сравнивать любые 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')
, но это означает, что я теряю много функциональных возможностей, связанных с углеродом, так как я по существу сравниваю их только со строками.
Я знаю, что мутаторы даты существуют, но, насколько мне известно, они работают только после того, как данные получены.
Заранее спасибо.