【问题标题】:Laravel Unique validation on checking multiple fieldsLaravel 检查多个字段的唯一验证
【发布时间】:2023-03-20 10:26:01
【问题描述】:

我有subject 表和字段standard_idstream_idmedium_idboard_idsubject_name 等等。

我想为subject_name 添加唯一规则,该规则对standard_idstream_idmedium_idboard_id 字段是唯一的。

$validator = Validator::make( $inputs, 
            [
                'v_name' => [
                        'required',
                        Rule::unique( 'tbl_subject' )->ignore( $id, 'id' ),
                    ],
            ],
            [
                'v_name.required' => 'Name is required',
                'unique' => 'Name address already exits.',
            ]
        );

例子

standard_id, stream_id, medium_id, board_id subject_name

1             2            1            3          A
3             2            4            1          B
1             3            1            4          c

如果 subject_name “A”对于 1、2、1、3 是唯一的。B 对于 3、2、4、1 是唯一的。 但是 subject_name "A" 对于 2,2,1,3 等不是唯一的..

【问题讨论】:

  • 您能否展示一下您迄今为止尝试过的内容以及它与您需要的不匹配的原因。
  • 例如,如果你得到Asubject_name 用于1, 2, 1, 3 输入组合,它会失败吗?您的请求中是否也包含这些输入?尝试实现类似于Adding additional where clauses 中提到的内容
  • 您使用表单请求?还是在控制器中验证?
  • @KurtFriars 控制器中的验证。
  • @AmitSenjaliya 你能分享你验证的代码吗

标签: php laravel laravel-5.8


【解决方案1】:

*** 与 OP 讨论后 ***

问题应该表明他们正在尝试插入单个记录,并希望验证数据库的唯一性。一种方法是通过custom rule,如下所示:

class UniqueSubject implements Rule
{
    private $keys;

    public function __construct(array $keys) {
        $this->keys = $keys;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        return ! Subject::where($this->keys)->where('subject_name', $value)->exists();
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The Subject Name must be unique for the given standard, stream, medium and board.';
    }
}

然后您可以在规则中使用验证,例如:

$keys = $request->only('i_standard_id', 'i_stream_id', 'i_board_id', 'i_medium_id');

$validator = Validator::make( $inputs, [
    ...
    'subject_name' => [
        'required',
        'string',
        new UniqueSubject($keys)
    ],
    ...
]);

【讨论】:

猜你喜欢
  • 2017-10-30
  • 2019-03-24
  • 2018-04-28
  • 1970-01-01
  • 1970-01-01
  • 2015-01-02
  • 2020-08-02
  • 2019-06-08
相关资源
最近更新 更多