Laravel Eloquent приращение без обновления меток времени - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть модель Eloquent, в которой я хотел бы увеличить один атрибут.До сих пор я использовал следующую строку кода для достижения этой цели:

Thread::where('id', $threadId)->increment('like_count');

Это, однако, имеет нежелательный побочный эффект обновления отметки времени updated_at.Я нашел следующий способ обновления записи без изменения метки времени:

    $thread = Thread::where('id', $threadId)->first();

    $thread->timestamps = false;
    $thread->like_count++;
    $thread->save();

Но это неожиданно выглядит гораздо менее сжатым.Поэтому я хотел бы знать, что есть способ использовать метод increment без обновления временных меток.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете заключить весь процесс в один метод модели.

0 голосов
/ 25 февраля 2019

Если вам вообще не нужны временные метки, вы можете отключить их раз и навсегда для этой конкретной модели, используя:

public $timestamps = false; внутри вашей модели.Это добавит дополнительный шаг, чтобы всякий раз, когда вы хотите, чтобы временные метки обновлялись, вам нужно присваивать им значение вручную, например $object->created_at = Carbon::now()

Во-вторых, если вы хотите, чтобы те отключались для определенного запроса, то, как вы упомянули в своем вопросе.это один из способов.

Другой способ - использование построителя запросов.Теперь метки времени - это функциональность, связанная с Eloquent.Однако, если вы обновляете с помощью простого построителя запросов, он не обновляет временные метки сам по себе.

Так что вы можете сделать:

DB::table('threads')
            ->where('id', $threadId)
            ->update([ 'votes' => DB::raw('votes + 1') ]);

Однако я лично предпочту использовать Eloquent.это если есть выбор.

...