我有一个可以让用户查看各种帖子的应用程序。 在我的模型中,我使用了引导方法,该方法将再次运行该模型中的任何查询,以便仅显示活动的帖子,并且到目前为止所有工作都可以进行。
protected static function boot()
{
parent::boot();
static::addGlobalScope('active', function (Builder $builder) {
$builder->where('active', 1);
});
}
但是现在碰巧的是,当用户使用该应用程序时,必须能够屏蔽帖子,因此,每次登录该应用程序时,他将永远不会再看到该帖子。
我创建了一个隐藏的帖子表,用于接收post
和user_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语句,但这似乎不起作用。
答案 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);
});
}