it-swarm.com.ru

Как я могу установить значение по умолчанию столбца метки времени на текущую метку времени с миграциями Laravel?

Я хотел бы создать столбец меток времени со значением по умолчанию CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, используя Laravel Schema Builder/Migrations. Я несколько раз просматривал документацию по Laravel и не понимаю, как сделать это по умолчанию для столбца метки времени.

Функция timestamps() устанавливает значения по умолчанию 0000-00-00 00:00 для обоих создаваемых столбцов.

108
JoeyD473

Поскольку это необработанное выражение, вы должны использовать DB::raw(), чтобы установить CURRENT_TIMESTAMP в качестве значения по умолчанию для столбца:

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

Это работает безупречно на каждом драйвере базы данных.

Начиная с Laravel 5.1.25 (см. PR 10962 и commit 15c487fe ) вы можете использовать новый метод модификатора столбца useCurrent(), чтобы установить CURRENT_TIMESTAMP в качестве значения по умолчанию для столбца:

$table->timestamp('created_at')->useCurrent();

Как уже было сказано, в MySQL вы также можете использовать предложение ON UPDATE через DB::raw():

$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));

Gotchas

  • MySQL

    Начиная с MySQL 5.7, 0000-00-00 00:00:00 больше не считается допустимой датой. Как указано в руководстве по обновлению Laravel 5.2 , все столбцы меток времени должны получать действительное значение по умолчанию при вставке записей в базу данных. Вы можете использовать модификатор столбца useCurrent() (от Laravel 5.1.25 и выше) в своих миграциях, чтобы использовать столбцы меток времени по умолчанию для текущих меток времени, или вы можете сделать метки времени nullable(), чтобы разрешить нулевые значения.

  • PostgreSQL & Laravel 4.x

    В версиях Laravel 4.x драйвер PostgreSQL использовал точность базы данных по умолчанию для хранения значений меток времени. При использовании функции CURRENT_TIMESTAMP для столбца с точностью по умолчанию PostgreSQL генерирует метку времени с более высокой доступной точностью, таким образом генерируя метку времени с дробной второй частью - см. Эту скрипту SQL .

    Это приведет к тому, что Carbon потерпит неудачную обработку метки времени, поскольку он не будет ожидать сохранения микросекунд. Чтобы избежать этого неожиданного нарушения работы вашего приложения, вы должны явно дать нулевую точность функции CURRENT_TIMESTAMP, как показано ниже:

    $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
    

    Начиная с Laravel 5.0, столбцы timestamp() были изменены для использования точности по умолчанию, равной нулю, что позволяет избежать этого.

    Спасибо @andrewhl за указание на эту проблему в комментариях.

210
Paulo Freitas

Чтобы создать оба столбца created_at и updated_at:

$t->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
$t->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP'));

Вам понадобится версия MySQL> = 5.6.5, чтобы иметь несколько столбцов с CURRENT_TIMESTAMP

40
Brian Adams

Начиная с Laravel 5.1.26, отмеченного 2015-12-02, добавлен модификатор useCurrent():

Schema::table('users', function ($table) {
    $table->timestamp('created')->useCurrent();
});

PR 10962 (сопровождаемый commit 15c487fe ) привел к этому дополнению.

Вы также можете прочитать вопросы 3602 и 11518 , которые представляют интерес.

По сути, MySQL 5.7 (с конфигурацией по умолчанию) требует, чтобы вы определяли либо значение по умолчанию, либо значение NULL для полей времени.

25
Gras Double

Вместо этого используйте Пауло Фрейтас предложение .


Пока Laravel не исправит это, вы можете запустить стандартный запрос к базе данных после запуска Schema::create.

    Schema::create("users", function($table){
        $table->increments('id');
        $table->string('email', 255);
        $table->string('given_name', 100);
        $table->string('family_name', 100);
        $table->timestamp('joined');
        $table->enum('gender', ['male', 'female', 'unisex'])->default('unisex');
        $table->string('timezone', 30)->default('UTC');
        $table->text('about');
    });
    DB::statement("ALTER TABLE ".DB::getTablePrefix()."users CHANGE joined joined TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL");

Это творило чудеса для меня.

8
Marwelln

Это не работает на самом деле:

$table->timestamp('created_at')->default('CURRENT_TIMESTAMP');

Он не удаляет «по умолчанию 0», который, кажется, идет с выбором метки времени, а просто добавляет пользовательское значение по умолчанию. Но нам это нужно без кавычек. Не все, что манипулирует БД, исходит от Laravel4. Это его точка зрения. Он хочет использовать пользовательские настройки по умолчанию для определенных столбцов, таких как:

$table->timestamps()->default('CURRENT_TIMESTAMP');

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


Update:answer Paulos Freita's/показывает, что это возможно, но синтаксис не прост. 

6
Glenn Plas

Используйте следующее:

$table->timestamp('created_at')->nullable();

Надеюсь, это поможет вам. Спасибо.

0
Foysal Nibir

Вот как ты это делаешь, я проверил, и он работает на моем Laravel 4.2.

$table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));

Надеюсь это поможет.

0
Jawad

В Laravel 5 просто:

$table->timestamps(); //Adds created_at and updated_at columns.

Документация: http://laravel.com/docs/5.1/migrations#creating-columns

0
JoenMarz