php - Laravel 在多列上的唯一验证
问题描述
我有一个表,它定义了像 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!');
}
},
],
]);
解决方案
在这种情况下,您的查询将使用以下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);
})
})
推荐阅读
- asp.net - 本地调试asp.net时如何设置web URL参数?
- r - r中的401未经授权的错误Binance API
- python - 从持久的函数更新变量(python3 和 tkinter)
- c - 检查内联汇编中的特定系统调用支持
- python-3.x - 带有变量的行的错误在哪里存在语法错误?
- css - 使用 CSS 边框创建具有与父级相同高度的伪元素的形状
- r - R中的h2o flow automl抛出错误
- java - Vagrant + Oracle VM + Java Hybris 调试
- bash - 用于数据组织的 bash shell 或 awk 脚本
- ios - Firebase 控制台中的“发送消息时出错”