Laravel 对多列的唯一验证

时间:2021-01-24 15:18:44

标签: php laravel validation unique

我有一个表,它定义了像 facebook 朋友这样的用户连接。它有像 -

这样的字段

id------------ sender_id ---------- receiver_id ---------------- 状态

现在,我想验证两列之间是否存在相同的数据。意思是,

1 ------------- 11 ---------- 22 -------- status 如果该行存在,然后

1 ------------- 11 ---------- 22 -------- status 这不应该是那里。还有

1 ------------- 22 ---------- 11 -------- status 这不应该是

这里,sender_id 是认证用户 ID。

我正在尝试验证receiver_id

$thisUser = auth()->user();

$validator = Validator::make($request->all(), [
            'receiver_id' => [
                'required', 
                'exists:users,id',
                Rule::unique('user_connections')->where('sender_id', $thisUser->id),
                function($attribute, $value, $fail) use($thisUser, $request) {
                    if($thisUser->id == $request->input('receiver_id')) {
                        return $fail('You cannot send request to own!');
                    }
                },
            ],
        ]);

1 个答案:

答案 0 :(得分:0)

在这种情况下,您的查询将使用 OR 条件检查两列 2 次,例如

让我们说

  • :sender_id = 11
  • :receiver_id = 22

第一个子句将匹配 sender_id 为 11,receiver_id 为 22,然后是另一个相同的子句,但会将这些列的值交换为 sender_id 为 22,receiver_id 为 11,因此查询看起来像

select count(*)
from user_connections
where (sender_id = :sender_id and receiver_id = :receiver_id)
   or (sender_id = :receiver_id and receiver_id = :sender_id)

您可以通过将查询扩展为来自定义您的独特规则

Rule::unique('user_connections')->where(function ($query) use($thisUser, $request) {
    return $query->where(function ($query) use($thisUser, $request) {
               $query->where('sender_id', $thisUser->id)
                     ->where('receiver_id', $request->input('receiver_id'));
           })->orWhere(function($query) use($thisUser, $request){
                $query->where('sender_id', $request->input('receiver_id'))
                     ->where('receiver_id', $thisUser->id);
            })
})