我一直在使用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,它是主索引的自动增量。
有任何想法或疑难解答提示吗?
答案 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
看看它是否有效。