Почему 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