我有一个表,它定义了像 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!');
}
},
],
]);
答案 0 :(得分:0)
在这种情况下,您的查询将使用 OR
条件检查两列 2 次,例如
让我们说
第一个子句将匹配 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);
})
})