Intereting Posts
Как создать службу Odata с помощью PHP? Получите два столбца с условием mysql Как использовать переменную $ result с объектом таблицы в SQL-запросе с использованием mySQLi Как отключить магические кавычки на общем хостинге? strip_tags () черный список, а не белый список Как средний массив на 100 кусков Проверьте, находится ли сайт внутри iframe Невозможно получить доступ к URL-адресу в маршрутах Laravel PHP preg_replace альтернатива Сделайте таймер обратного отсчета кнопки, который будет отключен навсегда после 5 минут даже при обновлении страницы, он должен оставаться отключенным MySQL PHP Escape String '\' – Почему он не сохраняется в базе данных с обратной косой чертой? Функция изображения в PHP Печать формата номера валюты в PHP Объединение строк в виде массива из другой таблицы для каждой строки выберите опцию в методе оплаты вместо кнопки «Радион» в пурпуре

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

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

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

Поскольку это сырое выражение, вы должны использовать 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 как CURRENT_TIMESTAMP ниже:

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

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

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

Чтобы создать оба столбца 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')); по $t->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP')); $t->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP')); 

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

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

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

PR 10962 (с последующим фиксацией 15c487fe ) привел к этому добавлению.

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

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

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


Пока 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"); к  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"); 

Для меня это твои чудеса.

Это не работает для факта:

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

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

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

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


Обновление: ответ Паулоса Фрейты показывает, что это возможно, но синтаксис не прост.

В Laravel 5 просто:

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

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

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

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

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