我的Laravel启动方法不接受任何条件

时间:2018-11-15 13:47:10

标签: laravel

我有一个可以让用户查看各种帖子的应用程序。 在我的模型中,我使用了引导方法,该方法将再次运行该模型中的任何查询,以便仅显示活动的帖子,并且到目前为止所有工作都可以进行。

protected static function boot()
{
   parent::boot();

  static::addGlobalScope('active', function (Builder $builder) {
      $builder->where('active', 1);
  });
}

但是现在碰巧的是,当用户使用该应用程序时,必须能够屏蔽帖子,因此,每次登录该应用程序时,他将永远不会再看到该帖子。

我创建了一个隐藏的帖子表,用于接收postuser_id

public function hide_post(Request $request, $post_id){

    $user = $this->getAuthorizedUser($request->header('X-User-Auth-Token'));
    $user = User::find(201);
    if (!$user) {
        return response()->json(['error' => true, 'code' => 401, 'message' => INVALID_AUTH_TOKEN], 401);
    }

    $data = [
        'user_id' => $user->id,
        'post_id' => $post_id,
        'created_at' => now(),
        'updated_at' => now()
    ];

    $reported_post = DB::table('hidden_posts')->insert($data);

    return response()->json(['success' => true, 'code' => 200, 'message' => 'Posted successfully hidden'], 200);
}

到目前为止,表已更新。

有没有一种方法可以修改引导方法,以确保应用程序不会向我显示我隐藏的帖子?

我尝试过:

protected static function boot()
{
    parent::boot();

   $hidden = DB::table('hidden_posts')->whereUser(Auth::id())->pluck('post_id')->toArray();

    // A global scope is applied to all queries on this model
    // -> No need to specify 'active' restraints on every query

    static::addGlobalScope('active', function (Builder $builder) {
        $builder->whereNotIn('post_id', $hidden);
        $builder->where('active', 1);
    });
}

但是当我尝试仅出于测试目的查看所有帖子时,使用我创建的新端点,就会出现错误:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user' in 'where clause' (SQL: select `post_id` from `hidden_posts` where `user` is null)

我想在启动方法中添加if语句,但这似乎不起作用。

1 个答案:

答案 0 :(得分:2)

boot函数在启动应用程序后才运行。此时,您正在收集所有隐藏的帖子,并使用全局作用域隐藏它们。但是,在启动应用程序后隐藏帖子时,除非重新启动应用程序,否则帖子不会反映在作用域中。您可以通过在需要时让作用域获取隐藏模型来避免这种情况:

protected static function boot()
{
    parent::boot();        
    static::addGlobalScope('active', function (Builder $builder) {
        $hidden = DB::table('hidden_posts')
               ->whereUserId(Auth::id())
               ->pluck('post_id')->toArray();
        $builder->whereNotIn('post_id', $hidden);
        $builder->where('active', 1);
    });
}

您可以通过执行以下操作来节省一些查询:

protected static function boot()
{
    parent::boot();        
    static::addGlobalScope('active', function (Builder $builder) {
        $builder->whereNotIn('post_id', function ($query) {
             $query->from('hidden_posts')
                  ->whereUserId(\Auth::id())
                  ->select('post_id');
        });
        $builder->where('active', 1);
    });
}