Laravel 5.2关系有很多与另一个唯一标识符

时间:2016-06-22 03:01:44

标签: php mysql laravel

所以我正在学习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');
}

但显然这不起作用。

1 个答案:

答案 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

希望这有帮助。