Laravel观察者未触发条件

时间:2020-02-22 15:59:37

标签: laravel

我正在学习Laravel,并且创建了一个基本博客。现在,我试图创建类似于自动博客的内容,其中帖子会根据start_date或end_date更改状态。因此,我在迁移中创建了一个枚举表,其中包含需要使用的状态。现在,如果日期和时间大于今天,但是我没有任何运气,我想做的就是将职位状态更改为即将到来。最初,我创建了一个事件,并将代码放在侦听器中,但工作方式(或不工作)与观察器相同。我读到,如果有多个事件,那么在观察者中会更好。

创建帖子后,流程将是检查开始日期,如果日期大于今天,则更改状态。如果我将其更改为正在创建,则下面的代码将状态更改为即将到来,而不是已创建,但是它仍未考虑start_date,因为它将start_date添加到每个帖子中,而与start_date无关。我尝试使用if语句,但一直卡住。我想念什么或做错什么?

最终,我的目标是使帖子自动更改状态,而无需任何用户启动的操作。也许,我可以为此使用Laravel队列,但我还没走那么远。目前,我正试图超越这一步。

 <?php

 namespace App\Observers;

 use App\Models\Post;
 use Carbon\Carbon;

 class PostObserver
  {
   public function created(Post $post)
    {

     $post = Post::whereDate('start_date', '>', Carbon::now()->toDateString(){

     $post->post_status = 1  // 1 = Upcoming status
    });
  }
}

2 个答案:

答案 0 :(得分:1)

让它像这样工作,是两种回应的结合,对此我很感激:

if (Carbon::parse($post->start_date)->greaterThan(Carbon::now()))
   {
    $post->post_status = 1;
   }

答案 1 :(得分:0)

使用方法creating

<?php

namespace App\Observers;

use App\Models\Post;
use Carbon\Carbon;

class PostObserver
{
    public function creating(Post $post)
    {
        if ($post->start_date->greaterThan(Carbon::now())) {
            $post->post_status = 1;
        }
    }
}

创建方法将在帖子保存到数据库之前被调用。在这一点上,您进行检查,仅在start_date大于当前时间戳记的情况下,post_status的值将为1。如果需要,可以设置else块,其中将值0设置为发布状态,以防它不是db default或需要这样的东西。