Почему Laravel 5 автоматически обновляет поле даты?

я хочу обновить поле (status) на модели. Я бы извлек из DB и назначил новое значение . Но после сохранения модели я увидел другое поле даты (published_at) также изменен на то же, что и updated_at. Действие запускается, когда пользователь нажимает на ссылку как http://localhost/dashboard/gallery/publish/1.

я не знаю, почему published_at обновление автоматически и так же, как updated_at?

здесь код:

<?php 
class GalleryController extends Controller
{
    /**
     * Approve to publish the gallery on the web.
     *
     * @param  int  $id
     * @return Response
     */
    public function getPublish($id)
    {
        $gallery = Gallery::whereId($id)->firstOrFail();       
        $gallery->status = Gallery::STT_PUBLISH;
        $gallery->save();
        return redirect( route('backend::gallery.edit',[$gallery->id]) )->with('status', 'Done');
    }
}
?>

и Модель Галерея:

<?php
namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentSoftDeletes;

class Gallery extends Model
{
  use SoftDeletes;
  protected $table = 'gallery';
  protected $fillable = ['title', 'slug', 'content', 'category_id', 'type'];
  protected $guarded = ['published_at','creator_id','thumbnail'];
  protected $dates = ['deleted_at', 'published_at'];
}
?>

и миграция func:

public function up()
    {
        Schema::create('gallery', function (Blueprint $table) {
            $table->increments('id')->unsigned();
            $table->string('slug')->unique();   
            $table->tinyInteger('type')->unsigned();
            $table->integer('category_id')->unsigned()->default(0); 
            $table->string('thumbnail');   
            $table->string('title');   
            $table->text('content');
            $table->integer('status')->unsigned()->default(0);
            $table->timestamp('published_at');
            $table->integer('creator_id')->unsigned();
            $table->timestamps();            
            $table->index(['slug']);
            $table->softDeletes();
        });
        Schema::table('gallery', function (Blueprint $table) {
            $table->foreign('category_id')->references('id')->on('category');
            $table->foreign('creator_id')->references('id')->on('users');
        });
    }

обновление

я вижу, что эта конфигурация в функции миграции создает проблему, здесь: $table->timestamp('published_at');

и этот оператор создает SQL так:

CREATE TABLE `gallery` ( 
    ...
     `published_at` Timestamp NOT NULL ON UPDATE CURRENT_TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ...
)

Итак, как настроить поле метки времени, которое не является автоматическим обновлением в текущее время?

обновление 2

готово, я изменяю миграцию, просто используйте dateTime вместо timestamp.

использовать его, $table->dateTime('published_at');, это заявление не будет обновлять авто на ТЕКУЩАЯ_ОТМЕТКА_ВРЕМЕНИ.

3 ответов


похоже, что происходит то, что MySQL (или какая бы база данных вы ни использовали) обновляет дату, а не Laravel.

вам нужно изменить:

$table->timestamp('published_at');

в:

$table->dateTime('published_at');
сделать php artisan migrate:refresh для отката и воссоздания таблиц.

этот пост старый, но для тех, кто получил эту проблему вот самое простое решение. В вашей миграции поле timestamp просто должно быть nullable. Чем не будет триггера автоматического обновления в этом поле.

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

нет необходимости использовать $table->dateTime() вместо $table->timestamp().


альтернативным решением является создание миграции, которая запускает этот запрос, чтобы удалить триггер ON UPDATE столбца:

ALTER TABLE queued_posts CHANGE scheduled_publish_time scheduled_publish_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP