Как правильно спроектировать корзину для гостей и пользователей?

Делаю корзину как для пользователей, так и для гостей. Я сделал единый 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);, но мне кажется это каким-то странным вариантом.

Какой из двух вариантов лучше использовать, если ни один из вариантов не является нормальным, в какую сторону посмотреть, подсмотреть?
  • Вопрос задан
  • 195 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы