Как обновить поле updated_at не обновляя данных в Laravel
Доброго времени суток. В одном из приложений на Laravel понадобилось мне изменять поле updated_at, но при этом не изменять данные. Как это сделать просто и красиво мы и рассмотрим ниже.
И так, у меня установлен Laravel. На время написания статьи версия Laravel 5.6.24
Давайте создадим таблицу в нашей базе данных items. Для этого создадим миграцию, выполнив команду в терминале
php artisan make:migration create_items_table --create=items
Миграция создана, давайте отредактируем ее и в метод up добавим следующий код:
Schema::create('items', function (Blueprint $table) { $table->increments('id'); $table->string('text'); $table->timestamps(); });
Теперь запустим миграцию, для этого выполним в терминале следующую команду:
php artisan migrate
Внимание: перед запуском миграции у вас должно быть настроено подключение к базе данных.
Теперь давайте создадим модель Item, которая будет работать с нашей таблицей items. Выполним в терминале следующую команду:
php artisan make:model Item
И добавим в нее одно свойство, которое разрешит нам массово добавлять данные в поле text:
protected $fillable = [ 'text', ];
Отлично, теперь давайте создадим контроллер TestController:
php artisan make:controller TestController
Отлично контроллер создан. Теперь давайте создадим в нем два метода: createTest – будет добавлять произвольную строку в базу данных и метод editTest – будет изменять поле updated_at при этом не изменять данные. Для этого мы будем использовать метод touch ORM Laravel.
Метод createTest:
public function createTest() { Item::create(['text' => str_random(100)]); return 'Ok'; }
Метод editTest:
public function editTest(Request $request) { $items = Item::find($request->id); $items->touch(); return 'Ok'; }
Отлично, теперь добавим роуты в файл routes/web.php
… Route::get('/add','TestController@createTest'); Route::get('/edit/{id}','TestController@editTest'); …
Ок, давайте добавим несколько строк в нашу таблицу. Для этого переходим по ссылке <ваш домен>/add
И проверяем таблицу items
Мы добавили две записи, давайте теперь обновим поле updated_at при этом не изменив другие данные. Для этого переходим <ваш домен>/edit/<id записи> (в моем случае http://lara.loc/edit/1)
И проверим таблицу items
Обратите внимание на столбец text и created_at – они не изменились, а вот столбец updated_at изменился.
Заключение.
Мы с вами изменили столбец updated_at в таблице при этом не меняя данных в других столбцах. Для этого мы использовали метод touch в ORM Laravel.