Вот моя схема миграции:
public function up()
{
Schema::create('objects', function (Blueprint $table) {
$table->increments('id');
$table->timestamp('timestamp1');
$table->timestamp('timestamp2');
});
}
Но когда я запускаю php artisan migrate, я получаю такую ошибку:
Illuminate\Database\QueryException : SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'timestamp2' (SQL: create table
objects(idint unsigned not null auto_increment primary key,timestamp1timestamp not null,timestamp2timestamp not null) default character set utf8mb4 collate utf8mb4_unicode_ci)
Я должен указать, что когда я удаляю одну из двух строк $table->timestamp(...);, она работает, но не работает, когда есть обе. А модель Object.php пуста как может быть. Я сделал ошибку?
Я прочитал эта почта, но, хотя при замене timestamp(...) на dateTime(...) ошибок больше нет, мне нужны только временные метки.
В таблице будет только один столбец с меткой времени, поэтому сделайте СИМВОЛ обновлением типа данных столбца.






Я нашел решение это на ларакастах:
nullableTimestamps() предназначены только для полей по умолчанию created_at, updated_at. для настраиваемых полей используйте timestamp()->nullable();
Но что, если я не хочу, чтобы эти временные метки допускали значение NULL? Если я хочу, чтобы они были установлены, например, на CURRENT_TIMESTAMP.
Вы можете использовать один в качестве текущего, но я не понимаю, зачем вам использовать два в качестве текущих.
Я не знаю, мне кажется странным, что, например, поля INT не обязательно должны иметь значение по умолчанию, но оно обязательно для временных меток.
Самое первое ненулевое поле будет настроено на использование CURRENT_TIMESTAMP по умолчанию. Я полагаю, что все должно иметь значение по умолчанию, если не допускает значения NULL.
Я опубликовал новый ответ, потому что не знал, будет ли у вас все в порядке, если я отредактирую ваш ответ, поскольку могут быть ошибки.
Проблема может возникнуть, если ваша схема БД не на английском, а, скажем, на испанском ... с точки зрения согласованности вы хотели бы, чтобы все столбцы были на одном языке, поэтому, если вы хотите иметь столбец с именем: 'creado' вместо 'created_at', laravel позволяет определить это в модели, но, как мы также видим, файл миграции не распознает это ... У меня та же проблема, я пытаюсь использовать последовательно испанские имена столбцов, но эта проблема с датой заставляет меня сомневаться, нужно ли вернуть все созданные / одифицированные столбцы на английский, просто чтобы не было проблем с этой проблемой с нулевым значением ()
Вы можете сделать одну из двух меток времени нулевой, используя
timestamp()->nullable();
используя ваш пример, вы должны использовать:
$table->timestamp('timestamp2')->nullable();
Также laravel встроил временные метки с помощью
$table->timestamps();
который будет автоматически обрабатывать метки времени updated_at и created_at для вас
Я знаю, что для timestamps() я просто хотел упростить свой пример.
Метки времени немного особенные, они должны либо допускать значение NULL, либо иметь значение по умолчанию. Таким образом, вы должны выбрать между timestamp('timestamp1')->nullable(); или timestamp('timestamp1')->useCurrent() или пользовательским значением по умолчанию, например timestamp('timestamp1')->default(DB::raw('2018-01-01 15:23')).
Я думаю, что все типы данных должны иметь значение NULL или значение по умолчанию.
Это неправда, например, VARCHAR и INT могут быть не обнуляемыми и не иметь значения по умолчанию. Вам просто нужно заполнить значение во время вставки.
WTF Mysql !? Почему мы не можем просто потребовать, чтобы метка времени была установлена для вставки, как и для любого другого столбца? Какая головная боль.
Оператор создания отлично работает для меня. Какую версию mysql вы используете?