Laravel 4:多列的独特验证

时间:2014-06-18 08:19:56

标签: validation laravel-4 unique multiple-columns

我知道这个问题早先被问过,但我没有得到相关答案。

我想知道如何编写规则来检查两列的唯一性。我试过写一个像:

这样的规则
public $rules = array(
    "event_id"=>"required",
    "label"=>"required|unique:tblSection,label,event_id,$this->event_id",
    "description"=>"required"
);

在我的示例中,我需要进行验证,以便一个标签对于单个事件ID可以是唯一的,但也可以用于其他事件ID。例如,我想实现:

id   event_id    label   description
1     1          demo    testing
2     2          demo    testing

在上面定义的规则中,我需要以某种方式传递当前选定的event_id,以便它可以检查数据库表中是否存在所选event_id的标签,但是我收到的语法错误如下:

{"error":{"type":"Symfony\\Component\\Debug\\Exception\\FatalErrorException","message":"syntax error, unexpected '\"'","file":"\/var\/www\/tamvote\/app\/modules\/sections\/models\/Sections.php","line":39}}

注意:我不想使用任何软件包,只需检查laravel 4是否足以允许编写此类规则。

5 个答案:

答案 0 :(得分:8)

Mohamed Bouallegue的回答是正确的。

商店方法的控制器中,您可以:

Model::$rules['label'] = 'required|unique:table_name,label,NULL,event_id,event_id,' .$data['event_id'];

其中$ data是您的POST数据。

对于更新方法,您可以:

$model = Model::find($id);
Model::$rules['label'] = 'required|unique:table_name,label,NULL,event_id,event_id,'.$data['event_id'].',id,id'.$model->id;

其中$ data是您的PUT / PATCH数据,$ model是您正在编辑的记录,而id是表主键。

答案 1 :(得分:2)

之前我没有尝试过,但我想如果你在验证之前得到event_Id那么你可以这样做:

'label' => 'unique:table_name,label,NULL,event_id,event_id,'.$eventId
//you should get the $eventId first

答案 2 :(得分:2)

如果要静态声明验证规则,也可以执行此操作。它不是最有效的,因为它检查数据库中的每个值。

protected $rules = [
    'user_id' => 'unique_multiple:memberships,user_id,group_id',
    'group_id' => 'unique_multiple:memberships,user_id,group_id',
]

/**
 * Validates that two or more fields are unique
 */
Validator::extend('unique_multiple', function ($attribute, $value, $parameters, $validator)
{
    //if this is for an update then don't validate
    //todo: this might be an issue if we allow people to "update" one of the columns..but currently these are getting set on create only
    if (isset($validator->getData()['id'])) return true;

    // Get table name from first parameter
    $table = array_shift($parameters);

    // Build the query
    $query = DB::table($table);

    // Add the field conditions
    foreach ($parameters as $i => $field){
        $query->where($field, $validator->getData()[$field]);
    }

    // Validation result will be false if any rows match the combination
    return ($query->count() == 0);

});

答案 3 :(得分:0)

与提到的Sabrina Leggett一样,您需要创建自己的自定义验证程序。

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundFill;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.util.Scanner;

public class NewMain extends Application {
    @Override
    public void start(Stage primaryStage) {
        Pane pane = new Pane();
        primaryStage.setScene(new Scene(pane, 300, 300));
        primaryStage.show();

        pane.setBackground(new Background(new BackgroundFill(Color.BLACK, CornerRadii.EMPTY, Insets.EMPTY)));

        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        System.out.println(str);
    }


    public static void main(String[] args) {
        launch(args);
    }
}

您可以通过在规则中添加以下行来调用验证器:

Validator::extend('uniqueEventLabel', function ($attribute, $value, $parameters, $validator) {
    $count = DB::table('table_name')->where('event_id', $value)
                                    ->where('label', $parameters[0])
                                    ->count();

    return $count === 0;
}, 'Your error message if validation fails.');

如果需要更多字段,可以在sql语句中添加一个新的where子句。

(来自:edcsthis answer

答案 4 :(得分:0)

当您正在寻找工作时间,但无济于事时,我对所有内容进行了测试……突然间,我发现文档的随机性:

'email' => Rule::unique('users')->where(function ($query) {
              return $query->where('account_id', 1);
           })

https://laravel.com/docs/5.5/validation#rule-unique

它运行完美,而且非常灵活:)