Laravel验证,其中一个字段是唯一的,而其他字段必须具有一些ID

时间:2018-11-18 14:45:58

标签: php laravel

我想将$params['user_id']传递给$ fieldValidations并检查小时是否对于特定的user_id是唯一的,而不是对于数据库表中的所有小时hour都是唯一的

我创建了一个模型帖子

class Post extends Model
{
    protected $fillable = ['user_id', 'hour'];
    public static $fieldValidations = [
        'user_id'  => 'required',
        'hour'      => 'required|date_format:Y-m-d H:i:s|unique:post,hour,NULL,user_id,'
    ];
}

和控制员职位

class PostController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index(Request $request)
    {

        $params = $request->all();
        $params['user_id'] = 12;  

        $validator = Validator::make($params, Post::$fieldValidations);
        if ($validator->fails()) {
            return Response::json($validator->errors()->all(), 422);
        }


    }
}

1 个答案:

答案 0 :(得分:2)

我认为您无法使用唯一的验证规则来执行此操作。从Laravel 5.7文档中:

The field under validation must be unique in a given database table.

请注意,它说的是表格而不是列。

您可能只需要查询数据库并在失败时返回JSON响应错误。另外,在验证规则中的当前代码中,您要指定user_id是发布表中的主ID关键字列。我认为这很可能是一个错误,应该将其删除,即使它与无关紧要,因为您无法使用唯一规则来完成所需的操作。另外,您以逗号结束了规则。

if (Post::where(['user_id' => $params['user_id'], 'hour' => $params['hour']])->exists()) {
            return response()->json(['status' => 'error', 'msg' => 'Error', 'errors' => ['hour_error' => ['That hour already exists on the user!']]], 422);
}

最后,我更喜欢使用$params = $request->all()辅助函数,而不是使用request()并将其内联到其余代码中。但是,这取决于您。