Laravel: работаем с created_at и updated_at (убираем поля, переопределяем updated_at и убираем поле updated_at)

Ромчик
0

laravelДоброго времени суток. В данной статье мы разберемся с одной особенностью механизма 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

Запуск миграции в Laravel

Как видим миграция успешно выполнена. Теперь переходим к созданию контроллера и модели. Для начала создадим модель 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).

Ошибка Unknown column

Чтобы 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 существует два способа:

  1. При вызове метода save передать в качестве параметра [‘timestamps’ => false].

Например:


$data = Test1::find($id);
$data->updated_at = '2018-01-19 10:00:00';
$data->save(['timestamps' => false ]);

  1. В самой модели переопределить метод getUpdatedAtColumn().

public function getUpdatedAtColumn() {
    return null;
}

Вывод.

Мы с вами рассмотрели, как при создании записи через Laravel Eloquent не добавлять данные в поля created_at и updated_at. Для этого просто добавили свойство в модель. Также рассмотрели два способа, как можно в ручную редактировать поле updated_at (первый способ – это передача параметра при сохранении записи, а второй способ – это переопределение метода в самой модели)

Понравилась статья? Поделись с друзьями.
  • Add to favorites
  • Добавить ВКонтакте заметку об этой странице
  • Twitter
  • Facebook
  • Мой Мир
  • LiveJournal
  • Одноклассники
  • Блог Я.ру
  • MySpace
  • FriendFeed
  • В закладки Google
  • Google Buzz
  • Яндекс.Закладки
  • Reddit
  • StumbleUpon
  • Technorati
  • del.icio.us
  • БобрДобр
  • LinkedIn
  • Memori.ru
  • Сто закладок
  • Blogger
©2012-2018 По всем вопросам обращайтесь через форму обратной связи

Яндекс.Метрика