2016-08-04 6 views
1

私はブロックされたユーザーと呼ばれるこのテーブルを持っています、それはそのようにレイアウトされています。Laravel Model、これを行うきちんとした正しい方法

id, user_id, blocked_user_id, reason, created_at, updated_at 

ここで私は2人が会話できるメッセージコントローラを持っています。私はそのようにしたメッセージを送信する前に、ユーザーがブロックされているかどうかを確認したい。

$blkchk = $thread->participants()->withTrashed()->get(); 
    foreach ($blkchk as $usr) { 
     $usrs[] = $usr->user_id; 
    } 
    $block = BlockedUsers::where('user_id',$usrs[0])->where('blocked_user_id', $usrs[1])->first(); 
    $block2 = BlockedUsers::where('user_id',$usrs[1])->where('blocked_user_id', $usrs[0])->first(); 
    if (!empty($block) || !empty($block2)) { 
     return response()->view('errors.403', ['error' => 'One of the users in this conversation is blocked.'], 404); 
    } 

これはかなり面倒ですが、blkchkは両方のユーザーIDを会話に追加しています。それらを配列として設定し、それぞれを個別にターゲットにします。完璧に動作しますが、私はこれがverry messyであると信じています。

これを行う方法については、正確で最善の方法がどのようになるのだろうと思っています。

+0

このコードが動作している場合は、http://codereview.stackexchange.com/ – phaberest

答えて

1

あなたは同様にwhereIn()メソッドを使用することができ、特定のエントリがblocked_usersテーブルに存在するかどうかをチェックしたいを考える:

個人的に
$blockedUsers = BlockedUsers::whereRaw(
        'user_id = ? AND blocked_user_id = ?', [$usrs[0], $usrs[1]] 
       ) 
       ->orWhereRaw(
        'user_id = ? AND blocked_user_id = ?', [$usrs[1], $usrs[0]] 
       ); 

if ($blockedUsers->count()) { 
    return 'Some of the users are blocked'; 
} 

を、私はあなたのデータベース設計はそれについて移動する最良の方法だとは思いませんしかし、これはあなたが必要とするもののために働くでしょう。

+0

にお問い合わせください。違いはuser_idはユーザーをブロックしたユーザーで、blocked_user_idはブロックされたユーザーです。この場合、上記の値は正しいでしょうか、それとも1つのidだけテーブル全体を検索するでしょうか?両方のIDが一致するか逆になる必要があるからです。 –

+0

ああ、初めて誤解しました。あなたのニーズに合わせて私の答えを編集しました。あなたは 'whereRaw()'を選択して、すべてを1つのクエリとして実行することができます。 –

+0

ありがとう、私は本当にそれを感謝します。 –

関連する問題