Реализация количества в заказах

golfstream

Новичок
Доброго всем времени суток.

В БД интернет магазина есть таблица orders с полями:
id, status_id, user_id, comment, created_at, updated_at.

Таблица product, где содержатся товары, поля: id, name и т.д.

И есть таблица order_product, созданная Doctrine для реализации связи many to many, поля: order_id product_id.

Вопрос следующий:

Как лучше в заказе реализовать количество каждого из наименований, чтобы можно было не 1 единицу товара заказать. а больше.

На всякий случай привожу код yml:

Код:
App\ShopBundle\Entity\Order:
type: entity
repositoryClass: App\ShopBundle\Repository\OrderRepository
table: orders
id:
    id:
        type: integer
        generator: { strategy: AUTO }
fields:
    comment:
        type: string
        nullable: TRUE
    created_at:
        type: datetime
        nullable: FALSE
    updated_at:
        type: datetime
        nullable: TRUE
manyToOne:
    order_status:
        targetEntity: Order_Status
        joinColumn:
            name: status_id
            referencedColumnName: id
    user:
        targetEntity: User
        joinColumn:
            name: user_id
            referencedColumnName: id
        cascade: ["persist"]
manyToMany:
    product:
        targetEntity: Product
        joinTable:
            name: order_product
            joinColumns:
                order_id:
                    referencedColumnName: id
            inverseJoinColumns:
                product_id:
                    referencedColumnName: id


lifecycleCallbacks:
    prePersist: [setCreatedAtValue]
    preUpdate: [setUpdatedAtValue]
 

golfstream

Новичок
Цена останется той, по которой человек успел купить, есть еще таблица cart для хранения корзины
Там есть: поля `id`, `product_id`, `user_token`, `created_at`, `quantity`, `sum`. Про удаления я не думал, только отключение , переименование товара нет, наверное лучше завести другой.
 

golfstream

Новичок
Если в плане интеграции онлайн кассы, то нет. Если честно про аспект оплаты я не думал вообще. Пока делаю функционал корзина, заказ, поиск товаров, фильтры. Да и проект это не коммерческий я на нем учусь разработке в Symfony
 

golfstream

Новичок
Решил проблему таким способом (криво или нет, судить вам):

Вместо связи many-to-many в orders сделал связь one to many в к вновь созданной таблице order_product, в которой расположил нужные поля, а также связи many to one к orders и product

Все работает, но код в контроллере, мне кажется объемным, может кто лаконичней подскажет:


Код:
public function newAction(Request $request)
    {
        $order = new Order();
        $form = $this->createForm('App\ShopBundle\Form\OrderType', $order);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            $token = $request->getSession()->get('token');
            $em = $this->getDoctrine()->getManager();
            $user = $order->getUser();
            $password = Userutils::genPasswd();
            $user->setToken($token)
                 ->setPassword(Userutils::genPasswd())
                 ->setUsername($order->getUser()->getEmail())
                ;
               
            $order->setOrderStatus($em->getRepository('AppShopBundle:Order_Status')->findOneBy(array('value' => 'new')));
            $cart = ($em->getRepository('AppShopBundle:Cart')->findBy(array('user_token' => $token)));
            $sum = 0;
            foreach ($cart as $key => $value){
           
                $order_product = new Order_Product();
                $order_product->setProduct($cart[$key]->getProduct())
                              ->setQuantity($cart[$key]->getQuantity())
                              ->setPrice($cart[$key]->getPrice())
                              ->setOrder($order)
                ;
                $em->persist($order_product);
                $order->addOrderProduct($order_product);
               
                $sum += ($cart[$key]->getSum() * $cart[$key]->getQuantity());
            }
           
            $order->setSum($sum);
            $em->persist($order);
            $order_products = $order->getOrderProduct();

            foreach ($order_products as $key => $value){
                $order_products[$key]->setOrder($order);
            }

            $em->flush();
            $em->getRepository('AppShopBundle:Cart')->clearCart($token);
               ;
            return $this->redirectToRoute('app_order_show', array('id' => $order->getId()));
        }
        return $this->render('order/new.html.twig', array(
              'order' => $order,
              'form' => $form->createView(),
        ));
    }
 
Последнее редактирование:
Сверху