0

假设我有一个用于验证FormRequest字段唯一性的自定义逻辑,需要在数据库中找到另一个资源,如下所示:

class CreateMyResourceRequest extends FormRequest {
public function rules() {
        return [
            'my_field' => [
                Rule::unique('some_other_resource', 'some_column')
                    ->where(function ($query) {
                        $otherResource = SomeOtherResource::where(...)->firstOrFail();

                        // Process the retrieved resource
                    }),
            ]

firstOrFail()调用显然使请求失败并出现 404 - 未找到,而我想返回 422 并在该字段上出现验证错误。

有没有办法在使用Rule::unique()框架提供的同时实现这一点?

提前致谢!

4

2 回答 2

1

我建议以下

public function rules()
{
    return [
        "your_field" => ["you_can_have_more_validations_here", function($key, $value, $cb) {

            $queryResult = SomeModel::find(1);

            if (someCondition) {
                $cb("your fail message");
            }
        }]
    ];
}

运行时$cb验证将失败并显示 422

于 2022-02-19T22:55:43.527 回答
0

不要使用firstOrFail,而只是使用first并检查输出是否为空。如果是,则返回 false。

或者,更多的 Laravel 方法是:

$query->leftJoin('otherresource', 'primarykey', 'foreignkey')->where(...)
于 2022-02-19T22:42:21.420 回答