0

Hiii 我有 2 个数据库表,列表:1“id,invoice_id,主题,总计”表:2“id,invoice_id,item_name,price”。每当我尝试在 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,所以如果没有项目 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。有什么办法可以解决这两个问题。

4

1 回答 1

0

如果您无法识别哪些项目已经存在以及哪些项目是新的,那么您剩下的选择是通过item_name+来识别项目invoice_id。缺点是您无法item_name以这种方式更新。

如果您正确设置了 Eloquent 模型,则可以使用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_nameand检查项目是否已经存在invoice_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']
            ]); 
        }

    }
于 2019-06-08T17:05:50.583 回答