Делаю корзину как для пользователей, так и для гостей. Я сделал единый
CartService
, который работает с интерфейсом
CartRepositoryInterface
, в который через DI прокидывается либо
CartGuestRepository
(если гость), либо
CartCustomerRepository
.
Существует две таблицы: carts и carts_products.
carts
| id | user_id | coupon_id |
|----|---------|-----------|
| 1 | 1 | 1 |
| 2 | 2 | 2 |
carts_products
| id | cart_id | product_variant_id | quantity |
|----|---------|--------------------|----------|
| 1 | 1 | 1 | 5 |
| 2 | 1 | 2 | 12 |
В целом при работе с авторизованным юзером логика работы с корзиной абсолютна прозрачна. Но вот в случае с гостем, возникли некоторые проблемы:
1. Первоначально все товары гостя хранились в сессии (тогда таблицы carts не было), весь обмен данными производился посредством сессии.
2. Как только мне понадобилось учитывать и промокод (поле coupon_id в таблице carts), я сделал отдельную таблицу carts, но теперь не понятно как работать в сессии отдельно с корзиной, и отдельно с товарами корзины.
Теоритически, я могу добавить поле session_id в таблицу carts и каждому гостю создавать корзину сразу же при добавлении товара, тогда и корзины, и товары гостей будут храниться в БД (до этого товары гостей хранились только в сессии).
А можно в саму сессию записывать
Session::set('cart', $value);
и
Session::set('cart_products', $value);
, но мне кажется это каким-то странным вариантом.
Какой из двух вариантов лучше использовать, если ни один из вариантов не является нормальным, в какую сторону посмотреть, подсмотреть?