Laravel 5.4 firstOrCreate或firstOrNew如果unique是唯一的id

时间:2017-05-01 10:18:49

标签: php mysql laravel insert

我正在处理我的小项目并且存在问题。 学习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函数中,我无法找到正确的方法。

2 个答案:

答案 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]);
}