Я хотел бы сделать столбец 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'));
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'));
Надеюсь это поможет.