我正在尝试使用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"]);
}
然而它只是不起作用。没有创建新项目,也不会更新任何项目。
任何人都知道我该怎么做?
感谢您提前获得帮助
答案 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]
]);
第一个参数指定在将记录分类为新记录或更新时要检查的属性。第二个参数传递值以使用。