2016-08-04 66 views
1

我有這個表格稱爲阻止用戶,它的佈局是這樣的。Laravel模型,這樣做的正確整潔的方式

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在對話中獲取用戶標識符。將它們設置爲一個數組,然後我分別針對每一個,它的工作原理是完美的,但我相信這很難理解。

只是想知道如何做到這一點正確和最新的方式。

+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。因爲兩個ID都需要匹配或反轉 –

+0

啊,我第一次誤解了它。我已經編輯了我的答案,以滿足您的需求。你想選擇'whereRaw()',這樣你就可以把它作爲一個查詢來完成。 –

+0

謝謝你,我真的很感激。 –