2016-06-22 14 views
1

私はlaravelを学び、ブロックされたユーザーリストを設定しようとしています。たとえば、ユーザーがあなたのプロフィールをブロックしてブロックする場合、私がそれをした方法が正しいかどうか疑問に思っています。Laravel 5.2関係hasManyと別の一意の識別子

以下は私が行ったことです。私の主な質問は、新しいIDフィールドを作成して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'); 
} 

は、その後、私はUNIQUE_IDとしてブロックされたユーザーIDと現在のユーザー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

私はあなたがルートに適用されたいくつかのミドルウェアの内部でこれを処理することができると思います。

php artisan make:middleware UserCanViewProfile 

その後、我々はミドルウェアがこのような、Profileモデルを持っているルートに適用されることを前提としています

Route::get('/profile/{profile}', '[email protected]'); 

今、私たちがアクセスすることで、当社のミドルウェアでは、プロファイルのインスタンスを取得しますrouteを通過してから、profile user idauth user idを含むブロックがあるかどうかを確認します。あなたは、$routeMiddleware下にApp\Http\Kernelファイル内でこのような何か、このミドルウェアを登録する必要があります。もちろん、

$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!'); 
} 

'usercanviewprofile' => \App\Http\Middleware\UserCanViewProfile::class, 

を次に、あなたのroutes

Route::group(['middleware' => ['usercanviewprofile'], 'prefix' => 'profile'], function(){ 
    Route::get('{profile}', '[email protected]'); 
}); 

それとも場合に適用しますCRUDパターンを使用しています:

Route::resource('profile', 'ProfileController')->middleware('usercanviewprofile'); 

うまくいけば、これが役に立ちます。

+0

本当に申し訳ありません。ユーザーがブロックされているかどうかを確認する方法をすでに設定しています。私が行ったやり方が正しいかどうか疑問に思っていました。私はこれを行ったが、私がやった方法が正しいかどうかは疑問だ。 "私の主な質問は、IDを設定してunique_idと呼ばれる新しいdbフィールドを作成する別の方法があります。ここでは、両方のユーザーIDを入れ、毎回クエリを実行します。" –

+0

@ Unifxはい、私が上で概説した方法はそれを必要としません。 – Ohgodwhy

+0

ああ申し訳ありませんが、私はその部分を見ていない、もう一度ありがとう –

関連する問題