更新数据库行,否则创建一个新行

时间:2018-03-24 11:24:32

标签: php mysql database

我正在尝试使用REPLACE INTO更新行(如果存在),否则必须创建一个新行。

我正在使用NOVA框架。这是我得到的:

public function updateTicketRows($id,$ticketId, $row, $stock, $price)
{
    $pdo = DB::getPdo();
    return DB::raw('REPLACE INTO ticket_rows (id,ticket_id,row,stock,price)
                    VALUES('.$pdo->quote($id).','.$pdo->quote($ticketId).','.$pdo->quote($row).','.$pdo->quote($stock).','.$pdo->quote($price).')');
}

它被称为:

foreach ($_POST['ticket'] as $ticket) {
                            $this->itemsModel->updateTicketRows($ticket['ticket_row_id'], $id,$ticket["ticket_row"],
                                $ticket["ticket_stock"],$ticket["ticket_price"]);
                        }

然而它只是不起作用。没有创建新项目,也不会更新任何项目。

任何人都知道我该怎么做?

感谢您提前获得帮助

1 个答案:

答案 0 :(得分:0)

您可以使用 ON DUPLICATE KEY UPDATE 来处理这种情况:

return DB::raw('INSERT INTO ticket_rows (id,ticket_id,row,stock,price) '.
                'VALUES('.$pdo->quote($id).','.$pdo->quote($ticketId).','.$pdo->quote($row).','.$pdo->quote($stock).','.$pdo->quote($price).') '.
                'ON DUPLICATE KEY UPDATE ticket_id='.$pdo->quote($ticketId).', row='.$pdo->quote($row).', stock='.$pdo->quote($stock).', price='.$pdo->quote($price).';');

...但是......看起来你正在使用Laravel,所以你应该真的依赖PDO对象来保护你免受SQL注入。使用::raw()绕过此保护。在这种情况下,您应该使用updateOrCreate()方法:

TicketRow::updateOrCreate(['ticket_id' => $ticketId], [
        ['row' => $row],
        ['stock' => $stock],
        ['price' => $price]
    ]);

第一个参数指定在将记录分类为新记录或更新时要检查的属性。第二个参数传递值以使用。