Вставка, если запись не существует, обновление, если существует - PullRequest
0 голосов
/ 08 июня 2019

Hiii У меня есть 2 таблицы базы данных с таблицей столбцов: 1 "id, invoice_id, subject, total" table: 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 так без идентификатора элемента, как я могу обновить свою запись ... ??? здесь 3-го пункта нет в моей таблице

вот мой контроллер

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);
}

I Кроме вывода, подобного этому

"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 голосов
/ 08 июня 2019

Если вы не можете определить, какие предметы уже существуют, а какие новые, оставшаяся опция - идентифицировать предметы по 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_name и 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']
            ]); 
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...