php - 检查 Laravel 中的值组合
问题描述
我有三列(input1、input2、input3),我需要比较它们并检查数据库中没有已经注册的值的组合。
true
当它们都相同或它们都不同时,我需要返回。在中间情况下,返回false
。
我试过了:
public function check($input1, $input2, $input3) {
if (Model::where('input1', 'LIKE', $input1)->where('input2', 'LIKE', $input2)->where('input3', '=', $input3)->exists()) {
return false;
} else {
if (Model::where('input1', '=', $input1)->where('input3', '!=', $input3)->exists()) {
return true;
}
if (Model::where('input1', '!=', $input1)->where('input3', '=', $input3)->exists()) {
return true;
}
if (Model::where('input1', '=', $input1)->where('input3', '=', $input3)->exists()) {
return true;
}
}
}
注册时未满足input1
,input3
但input2
表中未找到。
我该如何解决它,这个想法是比较三个输入。
谢谢!
更新:
我试过了:
public function check($input1, $input2, $input3) {
if (Model::where('input1', '=', $input1)->where('input3', '!=', $input3)->exists()) {
return true;
}
if (Model::where('input1', '!=', $input1)->where('input3', '=', $input3)->exists()) {
return true;
}
if (Model::where('input1', '=', $input1)->where('input3', '=', $input3)->exists()) {
return true;
}
if (Model::where('input1', '!=', $input1)->where('input3', '!=', $input3)->exists()) {
return false;
}
}
我需要更正上述内容,以便我可以验证所有三个值何时都匹配记录。
更新:
我需要根据图像进行验证
更新:
是我需要做的一个例子
更新:
解决策略可以是,仅验证三个值完全一致或完全不同的情况
public function check($input1, $input2, $input3)
{
// initialization
$temp1=true;
$temp1=true;
if (Model::where('input1', '=' ,$input1)->whereDate('input2', '=' ,$input2)->where('input3', '=' ,$input3)->exists()){
return true;
} else {
$temp1=false;
}
if ($temp1=false && Model::where('input1', '!=' ,$input1)->whereDate('input2', '!=' ,$input2)->where('input3', '!=' ,$input3)->exists()){
return true;
} else {
$temp2=false;
}
if ($temp1=false && $temp2=false){
return false;
}
}
解决方案
好的,您可以在一个简单的查询中完成,您想要的(从逻辑上讲)是一个 SQL 查询,例如:
SELECT *
FROM table
WHERE (
(value1 = ?) OR
(value2 = ?) OR
(value3 = ?)
)
如果这返回 1 行或更多行,那么您要返回false
. 因此,您可以利用exists
方法。它将使用EXISTS
SQL 方法或任何被调用的方法。
所以,你可以做两件不同的事情,我要展示的第一件和你做的一样,但我不知道你是否在控制器中使用它,所以你可以在 a FormRequest
or中使用它validator
。
你的方式
public function check($value1, $value2, $value3)
{
return !Model::where('value1', $value1)->where('value2', $value2)->where('value3', $value3)->exists();
}
看我!
之前写Clientes
的,所以如果这些数据存在,exists()
就会返回true
,但是在这种情况下你要相反。
另一种方式
现在,如果您想在编写规则的 avalidator
或 a中使用它FormRequest
,您应该有如下内容:
use Illuminate\Support\Facades\Validator;
Validator::validate(
[
'value1' => $value1,
'value2' => $value2,
'value3' => $value3,
],
[
'value1' => 'unique:clientes',
'value2' => 'unique:clientes',
'value3' => 'unique:clientes',
]
);
请记住,要逆exists
,我们使用unique
。如果存在任何值,那么它将抛出错误并返回视图(但这应该只在Controller
s 或FormRequest
s 中使用(规则,而不是validator
字面意思))。
更新:
要获得更好的代码,请执行以下操作:
public function check($input1, $input2, $input3)
{
if (Model::where('input1', $input1)->whereDate('input2', $input2)->where('input3', $input3)->exists()) {
return true;
} else if (Model::where('input1', '!=', $input1)->whereDate('input2', '!=', $input2)->where('input3', '!=', $input3)->exists()) {
return true;
}
return false;
}
尽管如此,这个查询可能会变得更好,只需一分为二,但我现在不能 100% 确定如何编写。
并且仍然没有多大意义(至少对我来说)检查它是否完全匹配一行(至少与某些字段),或者完全相反,不匹配任何行与这些值。这是一个异或门,但没有任何意义。
推荐阅读
- sql - 带有自引用表的sql server递归查询
- docker - Docker compose:运行几个仅在命令上有所不同的容器
- amazon-web-services - Redshift 中上个月的最后一天
- amazon-web-services - 是否可以更新 Lambda 堆栈以更改 Lambda 的日志组?
- forms - google api 聊天机器人:如何从表单输入中读取值
- header - 如何在 SULU 的所有页面中创建树枝模板标题?
- regex - 使用正则表达式从 HIVE 中的字符串中提取手机/电话号码
- wordpress - 在多语言 wordpress 网站中访问带有国家代码的根文件
- bash - 取消 xargs 循环命令而不退出循环
- android - 模仿系统应用程序级终止的Android Studio按钮在哪里?