所以我正在学习laravel并试图设置一个被阻止的用户列表,例如,如果你想阻止一个用户查看你的个人资料你会阻止它们,我已经这样做但是我只是想知道我是否有这样的方式完成它是正确的。
以下是我的所作所为。我的主要问题是,是否有另一种设置标识符的方法,不创建一个名为unique_id的新数据库字段,我将两个用户ID放入其中,然后每次查询它。
数据库迁移:
Schema::create('blocked_users', function(Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->integer('blocked_user_id')->unsigned();
$table->foreign('blocked_user_id')->references('id')->on('users')->onDelete('cascade');
$table->integer('unique_id')->unique();
$table->text('reason')->nullable();
$table->timestamps();
});
用户模型
public function BlockedUsers()
{
return $this->hasMany('App\Models\User\BlockedUsers');
}
然后,当我阻止用户时,我输入阻止的用户ID,将当前用户ID输入为unique_id
然后这是我正在做的一个混乱的部分我相信应该有一个更简单的方法。
if (BlockedUsers::whereUniqueId($user->id.Auth::user()->id)->exists()) {
$blocked = 1;
} else {
$blocked = 0;
}
我试图想办法在用户模型中设置一个函数,以检查user_id是否=当前用户,并且blocked_user_id等于用户个人资料ID。
我能想到的是
public function isUserBlocked()
{
return $this->hasOne('App\Models\User\BlockedUsers', 'blocked_user_id');
}
但显然这不起作用。
答案 0 :(得分:1)
我认为你可以在应用于路线的一些中间件中处理这个问题。
php artisan make:middleware UserCanViewProfile
然后我们假设中间件将应用于具有Profile
模型的路由,例如:
Route::get('/profile/{profile}', 'ProfileController@show');
现在我们将通过route
访问我们的中间件中的配置文件实例,然后我们将检查用户是否有包含profile user id
和{{ 1}}。
auth user id
当然,您需要在$profile = $this->route('profile');
$$block = BlockedUsers::where('user_id', $profile->user->id)->where('blocked_user_id', auth()->user()->id)->first();
if (empty($block)) {
return $next($request);
} else {
abort(403, 'You are not allowed to view that profile!');
}
下的App\Http\Kernel
文件中注册此中间件,如下所示:
$routeMiddleware
然后将其应用到'usercanviewprofile' => \App\Http\Middleware\UserCanViewProfile::class,
routes
或者,如果您使用Route::group(['middleware' => ['usercanviewprofile'], 'prefix' => 'profile'], function(){
Route::get('{profile}', 'ProfileController@show');
});
模式:
CRUD
希望这有帮助。