Laravel 5.4 - 插入重复行

时间:2017-09-18 18:00:26

标签: php laravel

我一直在使用Laravel几年,我对这个问题感到难过。使用Laravel 5.4和voyager。我在BREAD控制器之外有自己的控制器

表格:

<form method="POST" action="/admin/invites" accept-charset="UTF-8" class="form-edit-add">
<input name="_token" type="hidden" value="QgLgj5tG4RfD2CxCsqE2Qn5jcWfwQhsk5THT30vO">
<div class="panel-body">
<div class="form-group">
<label for="name">Business</label>
<input class="form-control" placeholder="Business Name" name="business_id" type="text">
</div>
<div class="form-group">
<label for="body">Referral Name</label>
<input class="form-control" placeholder="Referral Name" name="referral_name" type="text">
</div>
</div>
<input class="btn btn-primary width-100 mb-xs" type="submit" value="Save">
</form>

网络路线:

Route::resource('/admin/invites',  'InviteController');

控制器:

public function store(Requests\InviteRequest $request)
{
    DB::table('invites')->insert(
        [
            'user_id' => Auth::user()->id, 
            'business_id' => $request->business_id,
            'referral_name' => $request->referral_name,
            'url_token' => str_random(16)
        ]
    );
    return redirect('/admin/invites')->with([
                    'message'    => "Successfully Added New",
                    'alert-type' => 'success',
                ]);
}

当我提交它时,它会在数据库中创建2行。我没有重复的路由或控制器。我的请求文件为空。我在表中有一个ID,它是主索引的自动增量。

有任何想法或疑难解答提示吗?

2 个答案:

答案 0 :(得分:3)

我认为你在这里遗漏的要点是Voyager将其store()称为两次。首先,通过AJAX验证字段,然后再通过普通表单提交将BREAD存储到数据库。

查看Voyager中的默认store()实现:

public function store(Request $request)
{
        $slug = $this->getSlug($request);

        $dataType = Voyager::model('DataType')->where('slug', '=', $slug)->first();

        // Check permission
        Voyager::canOrFail('add_'.$dataType->name);

        //Validate fields with ajax
        $val = $this->validateBread($request->all(), $dataType->addRows);

        if ($val->fails()) {
            return response()->json(['errors' => $val->messages()]);
        }

        if (!$request->ajax()) {
            $data = $this->insertUpdateData($request, $slug, $dataType->addRows, new $dataType->model_name());

            return redirect()
                ->route("voyager.{$dataType->slug}.edit", ['id' => $data->id])
                ->with([
                        'message'    => "Successfully Added New {$dataType->display_name_singular}",
                        'alert-type' => 'success',
                    ]);
        }
}

注意if (!$request->ajax())条件,第一个AJAX调用将绕过它,但第二个调用将进入它并存储到数据库。

简而言之,您必须在store()方法中遵循相同的结构。首先执行验证。然后,当需要保存时,将该代码放入if (!$request->ajax())条件。

答案 1 :(得分:0)

您的表单存在一些问题:

router.get('/test',function(req, res, next){
  var start_date = req.query.start_date;
  var end_date = req.query.end_date;
  ProspectCont.getActionsIn(start_date,end_date).then(function(value, err){
    if(err)console.log(err);
    res.json(value);
  });
})

将标签<label for="name">Business</label> <input class="form-control" placeholder="Business Name" name="business_id" type="text"> 更改为for

for="business_id

将标签<label for="body">Referral Name</label> <input class="form-control" placeholder="Referral Name" name="referral_name" </div> 更改为for

将您的for="referral_name方法更改为:

store

看看它是否有效。