我正在处理我的小项目并且存在问题。 学习Laravel很有趣,并且按照Laravel团队想要的方式编写代码很有趣,但有时候我觉得我很想解决他们不应该解决的问题。
阅读文档后 - 对我来说一般来说firstOrCreate或firstOrNew函数都是一样的。所以据我所知,我可以创建一个函数来处理插入和更新功能。 到现在为止还挺好。 但如果“bill_id”不存在,我的插入有问题。
例如在我的溃败
中Route::post('/bill/save/', 'BillsController@saveBill');
和我的BillsController
public function saveBill(Request $request)
{
$bill = Bills::firstOrNew(['id' => $request->bill_id]);
$bill->client_id = $request->client_id;
...
$bill->save();
return redirect('admin/clients/'.$request->client_id);
}
我在视图中做了什么,创建了一个名为bill_id的隐藏字段,并从db获取该bill_id。
{!! Form::text('bill_id',$data['id'], ['hidden']) !!}
在我创建新帐单的视图页面中 - 该bill_id输入字段仍然存在但空值。
{!! Form::text('bill_id','', ['hidden']) !!}
因为bill_id是空的,我得到了错误。
SQLSTATE [22007]:无效的日期时间格式:1366不正确的整数值:''表示>第1行的列'id'
我相信学习框架是好的,有时候找到正确的方法来编写好的代码是有点棘手的,有时候对我来说它变成了做事的hackish方式。只有经过一些更新和学习后,我才意识到编写代码的正确方法是什么。但是这次我只是找不到如何传递空bill_id并让控制器在db中插入数据以及如果bill_id存在其刚更新表的方式。
正常的php if else语句我觉得在这种情况下不行。必须有正确的乳清才能做到这一点。
使用插入和更新功能一切正常,但在firstOrCreate或firstOrNew函数中,我无法找到正确的方法。
答案 0 :(得分:0)
以下功能将帮助您实现所需目标
public function saveBill(Request $request)
{
if($request->get('bill_id','') === '') {
$bill = new Bills();
} else {
$bill = Bills::find($request->bill_id);
}
$bill->client_id = $request->client_id;
...
$bill->save();
return redirect('admin/clients/'.$request->client_id);
}
答案 1 :(得分:0)
如果id
为空,则需要创建新的帐单,因为您的ID是主键,而且不能为空值。
当你将空值传递给firstOrCreate时会尝试创建新的Bills,但sql将无法执行此操作,因为id是主键
if(empty($request->bill_id)){
$bill = new Bills();
}else{
$bill = Bills::findOrFail(['id' => $request->bill_id]);
}