首页 > 解决方案 > 检查 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;
        }
    }  
}

注册时未满足input1input3input2表中未找到。

我该如何解决它,这个想法是比较三个输入。

谢谢!

更新

我试过了:

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;
    }
}

标签: phpdatabaselaravelfunctioncompare

解决方案


好的,您可以在一个简单的查询中完成,您想要的(从逻辑上讲)是一个 SQL 查询,例如:

SELECT *
FROM table
WHERE (
    (value1 = ?) OR
    (value2 = ?) OR
    (value3 = ?)
)

如果这返回 1 行或更多行,那么您要返回false. 因此,您可以利用exists方法。它将使用EXISTSSQL 方法或任何被调用的方法。

所以,你可以做两件不同的事情,我要展示的第一件和你做的一样,但我不知道你是否在控制器中使用它,所以你可以在 a FormRequestor中使用它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。如果存在任何值,那么它将抛出错误并返回视图(但这应该只在Controllers 或FormRequests 中使用(规则,而不是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% 确定如何编写。

并且仍然没有多大意义(至少对我来说)检查它是否完全匹配一行(至少与某些字段),或者完全相反,不匹配任何行与这些值。这是一个异或门,但没有任何意义。


推荐阅读