如果记录不存在则插入,如果存在则更新

时间:2019-06-08 08:50:41

标签: laravel-5

Hiii 我有2个数据库表,其中的列表为:1“ id,invoice_id,主题,总计”表:2“ id,invoice_id,item_name,价格”。当我尝试通过invoice_id来更新记录时(如果记录不存在)在项目表中,不会在项目表中插入新项目。

在这里我附上了我的JSON数据

{ 
"date": "2019-06-08", 
"client_id": "1", 
"currency_id": 4, 
"total_amount": null, 
"subject": "RD Management", 
"items": [
{ 
"item_name": "Saving",
"price": "500"
}, 
{ 
"item_name": "Fix",  
"price": "500"
},
{ 
item_name": "Current", 
"price": "200"
} 
]
}

这里也是一个问题 我的JSON也无法发送item_id 所以没有商品编号,我该如何更新我的记录...? 这里第三项不在我的桌子上

这是我的控制器

foreach ($request->items as $key => $items) 
{
$item_update = [
'item_name'    => $items['item_name'],
'price'  => $items['price']
];
DB::table('items')
->where('invoice_id', $id)
->update($item_update);
}

我除了这样的输出

"items": [
{
"id": 1,
"invoice_id": "1",
"item_name": "Saving",
"price": "500",    
},
{
"id": 2,
"invoice_id": "1",
"item_name": "Fix",
"price": "500",      
},
{
"id": 3,
"invoice_id": "1",
"item_name": "current",
"price": "200",       
},
]

但我的实际输出是

"items":[
{
"id":"1"
"item_name": "Fix",
"price": "500",       
},
{
"id":"2"
"invoice_id": "1",
"item_name": "Fix",
"price": "500",       
}
]

此输出在更新时覆盖item_name。 有什么办法可以解决这两个问题。

1 个答案:

答案 0 :(得分:0)

如果您无法识别已经存在的项目和哪些是新项目,则剩下的选择是通过item_name + invoice_id来识别项目。不利之处是您无法通过这种方式更新item_name

如果您已正确设置了雄辩的模型,则可以使用updateOrCreate()

<?php
foreach ($request->items as $key => $items) 
{
    $itemAfterUpdate = App\Item::updateOrCreate(
        [ 
            'invoice_id' => $id, 
            'item_name' => $items['item_name'] 
        ], 
        [ 'price' => $items['price'] ]
    );
}

如果没有,那么您基本上必须执行Eloquent在幕后所做的事情,即根据item_nameinvoice_id检查该项目是否已经存在,然后相应地进行插入或更新。

 <?php
    foreach ($request->items as $key => $items) 
    {
        $alreadyExists = DB::table('items')
            ->where('invoice_id', $id)
            ->where('item_name', $items['item_name'])
            ->exists();
        }
        if($alreadyExists){
            DB::table('items')
                ->where('invoice_id', $id)
                ->where('item_name' => $items['item_name'])
                ->update(['price' => $items['price']);  
        }
        else{
            DB::table('items')->insert([
                'invoice_id' => $id, 
                'item_name' => $items['item_name'],             
                'price' => $items['price']
            ]); 
        }

    }