Search code examples
shopwareshopware6shopware6-app

How can cart table associate with another table?


I have table table_name(id, cart_token, data , created_at, updated_at ) that wants to associate with shopware cart table using token column (table_name.cart_token = cart.token).

How can we do this association using DAL as long as cart table doesn't have a CartEntity and CartDefinition.

For example: Select * from table_name leftjoin cart on table_name.cart_token=cart.token where cart.token=null.


Solution

  • Without a definition and accompanying entity class you simply won't be able to retrieve the cart as a mapped object using the DAL. You could add your own definition and entity for the cart table but I wouldn't recommend it, as this would just cause problems if multiple extensions got the same idea. I would recommend injecting Doctrine\DBAL\Connection in a service of your plugin and just fetching the cart using raw SQL.

    class CartFetcherService
    {
        private Connection $connection;
    
        public function __construct(Connection $connection)
        {
            $this->connection = $connection;
        }
    
        public function fetchCart(YourCustomEntity $entity): ?array
        {
            $cart = $this->connection->fetchAssociative(
                'SELECT * FROM `cart` WHERE `token` = :token',
                [
                    'token' => $entity->getToken(),
                ]
            );
    
            return $cart ?: null;
        }
    }
    

    If you want to retrieve the Cart object directly, you could also inject the Shopware\Core\Checkout\Cart\CartPersister service to load the cart.

    class CartLoaderService
    {
        private CartPersister $persister;
    
        public function __construct(CartPersister $persister)
        {
            $this->persister = $persister;
        }
    
        public function getCart(YourCustomEntity $entity, SalesChannelContext $context): ?Cart
        {
            try {
                $cart = $this->persister->load($entity->getToken(), $context)
            } catch (\Throwable $exception) {
                $cart = null;
            }
    
            return $cart;
        }
    }