2016-08-04 3 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 지저분하다고 생각합니다.

이 작업을 수행하는 방법이 정확하고 깔끔한 방법 일지 궁금합니다.

+0

이것이 작동하는 코드 인 경우 http://codereview.stackexchange.com/ – phaberest

답변

1

특정 항목이 blocked_users 테이블에 존재하는지 여부, 당신은 마찬가지로 whereIn() 방법을 사용할 수 있습니다 확인 할 감안할 때 : 개인적으로

$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에 대해 전체 테이블을 검색 할 것인가? 두 아이디가 일치되거나 뒤집어 져야하기 때문에 –

+0

아, 처음으로 오해했습니다. 나는 당신의 필요에 맞게 내 대답을 편집했습니다. 'whereRaw()'를 선택하면 모든 것을 하나의 쿼리로 처리 할 수 ​​있습니다. –

+0

고마워, 정말 고마워. –