在我的应用程序中,我有可发布的公告,其中有一个 Announcement
模型,以下是架构:
Schema::create('announcements', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('message');
$table->text('message_details');
$table->string('author');
$table->string('status');
$table->timestamp('published_at')->nullable();
$table->timestamps();
});
我还有一个 AnnouncementObserver
来观察模型变化。
我认为要设置 published_at
我可以使用 updated
事件,如下所示:
/**
* Handle the announcement "updated" event.
*
* @param \App\Announcement $announcement
* @return void
*/
public function updated(Announcement $announcement)
{
$changes = $announcement->getChanges();
if ($changes['status'] === 'published') {
$announcement->published_at = Carbon::now();
}
Log::notice("An announcement was updated: {$announcement->title} by: " . auth()->user()->full_name);
}
但是,这并未更新published_at
。我在更新时没有这样做,因为我找不到方法来确定该值是否实际上已更改。
我在这里过于复杂化了吗?
来自反馈
/**
* Handle the announcement "creating" event.
*
* @param \App\Article $announcement
* @return void
*/
public function updating(Announcement $announcement)
{
if ($announcement->isDirty(['status'])) {
$new_status = $announcement->getDirty('status');
if ($new_status == 'published') {
dd('weng');
}
}
}
但是这不太有效...
根据给出的答案,这就是我最终得到的结果......
/**
* Handle the announcement "creating" event.
*
* @param \App\Announcement $announcement
* @return void
*/
public function updating(Announcement $announcement)
{
// Set published_at when published
if ($announcement->isDirty('status') && $announcement->status === 'published') {
$announcement->published_at = now();
}
// Set published_at to null when unpublished
if ($announcement->isDirty('status') && $announcement->status !== 'published') {
$announcement->published_at = null;
}
}
因此,如果发布状态发生更改,published_at
将变为 NULL
。
最佳答案
您可以做的是将其更改回更新
,并使用$announcement->isDirty()
检查公告是否已更改。如果对象的一个或多个属性自数据库检索以来发生了更改,则此方法将返回 true。
关于php - Laravel - 设置published_at属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57254552/