我知道这个问题早先被问过,但我没有得到相关答案。
我想知道如何编写规则来检查两列的唯一性。我试过写一个像:
这样的规则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是否足以允许编写此类规则。
答案 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子句。
(来自:edcs的this 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
它运行完美,而且非常灵活:)