Laravel: работаем с created_at и updated_at (убираем поля, переопределяем updated_at и убираем поле updated_at)
Доброго времени суток. В данной статье мы разберемся с одной особенностью механизма Laravel Eloquent. При создании новой записи в базе данных – поле created_at обновляется автоматически. Также при обновлении данных поле updated_at тоже обновляется. Но, иногда, возникают ситуации, когда нам не нужны поля created_at и updated_at или поле updated_at мы хотим редактировать в ручную. Что же делать в этом случае?
Остановимся на первой ситуации: нам не нужны поля created_at и updated_at.
Убираем обработку полей created_at и updated_at
Давайте создадим миграцию, которая будет создавать таблицу test1 с полями id, name, text (обратите внимание наша таблице не содержит поля created_at и updated_at)
artisan make:migration create_test1_table --create=test1
Теперь откроем вновь созданный файл миграции и добавим в него следующий код:
<?php use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateTest1Table extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('test1', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->text('text'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('test1'); } }
Миграцию создали и описали. Теперь можем ее запустить.
Внимание. Перед запуском миграции необходимо настроить подключение к базе данных.
artisan migrate
Как видим миграция успешно выполнена. Теперь переходим к созданию контроллера и модели. Для начала создадим модель Test1.
artisan make:model Test1
Добавим в нее следующий код:
<?php namespace App; use Illuminate\Database\Eloquent\Model; class Test1 extends Model { protected $table = 'test1'; protected $fillable = [ 'name', 'text', ]; }
$table = ‘test1’ говорит модели, что работаем с таблицей test1
Теперь создадим контроллер Test1Controller, в котором будет всего три метода: вывод записей, вывод формы для создания записи и создание новой записи.
artisan make:controller Test1Controller
И добавим в него следующий код:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Test1; class Test1Controller extends Controller { public function getData() { $all = Test1::all(); return view('test1')->with(['data' => $all]); } public function getForm() { return view('form'); } public function postForm(Request $request) { $name = $request->name; $text = $request->text; Test1::create([ 'name' => $name, 'text' => $text, ]); return redirect()->route('getData'); } }
Теперь давайте создадим вьюшки test1.blade.php и form.blade.php, и добавим в них код соответственно:
<!doctype html> <html lang="{{ app()->getLocale() }}"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Получаем данные</title> </head> <body> <table> <thead> <td>Заголовок</td> <td>Текст</td> </thead> @foreach($data as $d) <tr> <td> {{ $d->name }} </td> <td> {{ $d->text }} </td> </tr> @endforeach </table> </body> </html>
И:
<!doctype html> <html lang="{{ app()->getLocale() }}"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Получаем данные</title> </head> <body> <form method="POST" action="{{ route('postForm') }}"> {{ csrf_field() }} <input name="name"> <textarea name="text"></textarea> <button type="submit">Сохранить</button> </form> </body> </html>
Осталось добавить роуты в файл routes/web.php и проверить:
Route::get('/get','Test1Controller@getData')->name('getData'); Route::get('/add','Test1Controller@getForm')->name('getForm'); Route::post('/add','Test1Controller@postForm')->name('postForm');
Если мы попытаемся добавить новую запись, то у нас возникнет ошибка «Column not found: 1054 Unknown column ‘updated_at’» (все верно, мы же создали нашу таблицу без полей created_at и updated_at).
Чтобы Laravel Eloquent автоматически не добавляла данные в поля created_at и updated_at необходимо в модели добавить следующее свойство:
public $timestamps = false;
В нашем случае это свойство необходимо добавить в модель Test1.php.
Давайте снова добавим данные.
Все хорошо, данные записаны без дополнительных полей created_at и updated_at.
Ручное редактирование поля updated_at
Иногда нам необходимо отредактировать поле update_at, но стандартным путем это не пройдет. В Laravel Eloquent при создании новой записи с помощью метода create() или save() поля created_at и updated_at заполняются автоматически (если мы не указали свойство $timestamps = false, как мы сделали это выше). А при обновлении записи поле update_at будет изменен, если хоть одно значение изменено. Так, вот если мы в ручную изменим updated_at и сохраним запись, то Laravel перепишет поле updated_at.
Для того, чтобы этого не происходило в Laravel существует два способа:
- При вызове метода save передать в качестве параметра [‘timestamps’ => false].
Например:
$data = Test1::find($id); $data->updated_at = '2018-01-19 10:00:00'; $data->save(['timestamps' => false ]);
- В самой модели переопределить метод getUpdatedAtColumn().
public function getUpdatedAtColumn() { return null; }
Вывод.
Мы с вами рассмотрели, как при создании записи через Laravel Eloquent не добавлять данные в поля created_at и updated_at. Для этого просто добавили свойство в модель. Также рассмотрели два способа, как можно в ручную редактировать поле updated_at (первый способ – это передача параметра при сохранении записи, а второй способ – это переопределение метода в самой модели)