プロが教えるわが家の防犯対策術!

カートに入れるボタンを押したときに、
・同一ユーザー、同一商品があればカート数量をカウントアップする
・もしなければ、新規カートを追加する
処理を追加したいです。

cartテーブル(ユーザがカートに追加した商品の情報)が
cart_id, user_id, item_id, amount, create_date, update_date

productテーブル(商品情報)が
id, name, price, img, status, create_date, update_date

item_stockテーブル(在庫情報)が
stock_id, item_id, stock, create_date, update_date
になります。
SQL文をどのように記述すればいいですか?

//以下はカートテーブルに入れるときのSQL文です。(他のコードは省略しています。)

$sql = 'INSERT INTO cart(user_id, item_id, amount, create_date, update_date)
VALUES(?, ?, ?, ?, ?)';
$stmt = $dbh->prepare($sql);
$stmt->bindValue(1, $user_id, PDO::PARAM_INT);
$stmt->bindValue(2, $item_id, PDO::PARAM_INT);
$stmt->bindValue(3, 1, PDO::PARAM_INT); //在庫は1にする
$stmt->bindValue(4, $date, PDO::PARAM_STR);
$stmt->bindValue(5, $date, PDO::PARAM_STR);
$stmt->execute();
$msg[] = 'カートに追加しました!';

//以下はproductテーブルからすべて取得するときのSQL文です。
$sql = 'SELECT product.id, name, price, img, status, stock
FROM product
JOIN item_stock
ON product.id = item_stock.stock_id
WHERE status = 1';
// ステータスが1の商品のみを表示する
$stmt = $dbh->prepare($sql);
$stmt->execute();
//レコードを取得する
$rows = $stmt->fetchALL();

質問者からの補足コメント

  • どう思う?

    自分は以下のやり方で試してみました。
    最初にカートに追加する対象商品がすでにカートに入っているかどうか確認する。
    $sql = 'SELECT item_id, amount FROM ec_cart WHERE item_id = ? AND user_id = ?';
    ……$rows = $stmt->fetchAll();
    その後 if(empty($rows)) 〜で
    「カートに追加の対象商品がすでにカートに入っていない場合」と「カートに入っている場合」でそれぞれSQL文を作る。
    これだとかなり長くなりました。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/02/24 23:10

A 回答 (1件)

私なら、user_id と item_id にUNIQUE制約を付けておいて、DUPLICATE(重複)が発生した場合はUPDATEが走るように作るのが楽かな。



https://artisan.hatenablog.com/entry/2017/10/29/ …

検証してませんが、SQLとしては↓こんな雰囲気かと思います。

INSERT INTO cart(user_id, item_id, amount, create_date, update_date)
VALUES(?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
update_date = ?
amount = amount + 1
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!