我想更新模型上的字段(status
)。我将从DB中检索并为status
列分配一个新值。但是在模型保存后,我看到另一个日期字段(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 App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
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'];
}
?>
和迁移函数:
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');
,此语句不会自动更新CURRENT_TIMESTAMP。
6条答案
按热度按时间eyh26e7m1#
看起来正在发生的事情是MySQL(或您正在使用的任何数据库)正在更新日期,而不是Laravel。
你需要改变:
致:
然后执行
php artisan migrate:refresh
回滚并重新创建表。1cklez4t2#
这篇文章是旧的,但对于任何人谁得到这个问题在这里是最简单的解决方案。在迁移过程中,时间戳字段必须为空。则此字段将不会自动更新触发器。
不需要使用
$table->dateTime()
而不是$table->timestamp()
。mepcadol3#
这不是Laravel的问题,而是MySQL的“特性”。
根据reference manual MySQL 5.6
TIMESTAMP和DATETIME列没有自动属性,除非显式指定,但以下情况例外:如果禁用explicit_defaults_for_timestamp系统变量,则第一个TIMESTAMP列同时具有DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP(如果未显式指定这两个变量)。
官方网站删除了旧版本的参考手册,但当我谷歌的问题,从来源,也提到了这个问题,似乎该功能是有旧版本的MySQL太。
因此,除了将
$table->timestamp('published_at');
更改为$table->dateTime('published_at');
,您还可以尝试通过以下方式解决问题:1.给时间戳一个默认值。例如
$table->timestamp('published_at')->default(DB::raw('CURRENT_TIMESTAMP'));
或$table->timestamp('published_at')->nullable()
(其中默认值为空)1.将行移动到
$table->timestamps();
之后,使得pulibhsed_at
不是第一时间戳。默认的created_at
和updated_at
是可空的(即具有默认值空)将不会触发“特征”pdtvr36n4#
无需将迁移更改为
做就行了
要显示日期,您可以在模型中使用类似的内容
在视图中
要在存储/更新资源时使用当前时间戳,可以使用
jdzmm42g5#
这把我逼疯了,这不是Laravel的东西,只要去你的PHP我的admin -> database -> table -> structure,你会发现这个列有一个Extra属性“on update current_time_stamp”,点击更改,然后转到属性,将其更改为空选项并保存
8xiog9wr6#
替代解决方案是创建一个迁移,运行此查询以删除列的ON UPDATE触发器:
ALTER TABLE queued_posts CHANGE scheduled_publish_time scheduled_publish_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP