Поле редактирования во время красноречивого запроса Laravel - PullRequest
0 голосов
/ 10 июня 2019

Сценарий

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

Я знаю, что мутаторы даты существуют, но, насколько мне известно, они работают только после того, как данные получены.

Заранее спасибо.

1 Ответ

0 голосов
/ 10 июня 2019

вы можете попробовать разыграть свое поле.вставьте этот код в вашу модель.

protected $casts = [
    'date'  => 'date:Y-m-d',
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...