laravel 批量插入数据,后台该如何校验?

  1. 比如说前台传递过来一个json数组,里面每一个条目都是一条数据,在这种情况下改如何处理呢?
<?php

namespace App\Http\Requests;

use App\User;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Facades\Auth;

class StoreEvaluateStudentCourseRecordPost extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            // 保存评价记录验证
            '*.type' => 'required',
            '*.class_id' => 'required|integer',
            '*.course_id' => 'required|integer',
            '*.student_id' => 'required|integer',
            '*.quota_id' => 'required|integer',
            '*.evaluate_data' => 'required|max:191',
        ];
    }

    /**
     * 配置验证器实例。
     *
     * @param  \Illuminate\Validation\Validator  $validator
     * @return void
     */
    public function withValidator($validator)
    {

        /**
         * 目前只有一个评价记录模板,每提交一种类型的评价需要新建一张表存储,由于评价类型传递字段的不可控性,我采取每一种评价类型建一张表的方式
         * 验证:
         * student_course 老师对学生课程指标评价 对应的是evaluate_student_course_records 表
         */
        $validator->after(function ($validator) {
            $infos = $validator->getData();
            if(!empty($infos) && isset($infos[0]) && is_array($infos[0])){ // 多维数组上传
                foreach ($infos as $info){
                    if(!empty($info['type']) && $info['type'] == 'student_course' && !empty($info['class_id']) && !empty($info['course_id']) && !empty($info['student_id'])
                        && !empty($info['quota_id']) && !empty($info['evaluate_data'])
                    ){
                        if(User::hasQuota(Auth::id(), $info['class_id'], $info['course_id'], $info['quota_id'])){
                            return true;
                        }
                    }
                }
            }

            $this->failedValidation($validator); // 让校验失败
        });
    }


//    public function validator(ValidationFactory $factory)
//    {
//        $data = $this->validationData();
//        if(!empty($data) && is_array($data)){
//            foreach ($data as $d ){
//                $instance = $factory->make(
//                    $d, $this->container->call([$this, 'rules']),
//                    $this->messages(), $this->attributes()
//                );
//                if (method_exists($this, 'withValidator')) {
//                    $this->withValidator($instance);
//                }
//                $instance->validate();
//            }
//        }
//    }
}
阅读 3.8k
2 个回答

使用Form Request Validation

假设下面是客户端提交的json数据:

[{"username":"","age":22},{"username":"lisi","age":24}]

这样也算是批量了。

然后,我们根据文档,创建一个单独的Form Request类,通过artisan命令:

php artisan make:request storeDataFormRequest

文件被创建在app/Http/Requests/storeDataFormRequest.php,然后authorize方法修改为返回true,添加规则,然后创建自定义消息,然后最终如下:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class storeDataFormRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            '*.username' => 'required'
        ];
    }
    
    // 我重写了此方法
    public function messages()
    {
        return [
            '*.username.required' => 'username can not be blank'
        ];
    }
}

然后,控制器中使用:

// ...

use App\Http\Requests\StoreDataFormRequest;

// ...

public function storeData(storeDataFormRequest $request)
{
    // 不需要任何验证逻辑,直接写你后面的逻辑
}

最后提示,validation默认是页面跳转,如果希望返回json,客户端请求头需加上:

"Accept":"application/json"

测试:

{"0.username":["username can not be blank"]}

很显然我们第一条记录username为空!

希望能帮到你!

首先,在你的Model中定义好可以可直接复用或者不用的字段:

<?php
class xxx extends Model {
    protected $fillable = [];
    // or
    protected $guarded = [];
}

然后在Controller中可以直接插入。

<?php
class XxController extends Controller {
    public function test(Request $request) {
        XxModel::create($request->all());
    }
}

至于数据校验,直接上Validator就行。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题