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

Проверенные VDS на SSD в Европе от $4 и России: Датацентр №1 от 199руб

Тема в разделе "PHP и базы данных", создана пользователем golfstream, 5 окт 2017.

  1. golfstream

    golfstream Новичок

    Сообщения:
    13
    Ваш город:
    Москва, Россия
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Доброго всем времени суток.

    В БД интернет магазина есть таблица 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]
     
  2. antson

    antson на форуме с 2005 года Партнер клуба

    Сообщения:
    1.158
    Ваш город:
    Россия, Липецк
    Address:
    Lipetsk, Russia
    Country:
    Location on Map:
    @golfstream, если на сайте обновиться цена ? в твоей схеме что будет с ценой товара у оплаченного уже заказа ?
    а если товар удалили ? переименовали ? и т.п.

    намек понял ?
     
  3. golfstream

    golfstream Новичок

    Сообщения:
    13
    Ваш город:
    Москва, Россия
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Цена останется той, по которой человек успел купить, есть еще таблица cart для хранения корзины
    Там есть: поля `id`, `product_id`, `user_token`, `created_at`, `quantity`, `sum`. Про удаления я не думал, только отключение , переименование товара нет, наверное лучше завести другой.
     
  4. antson

    antson на форуме с 2005 года Партнер клуба

    Сообщения:
    1.158
    Ваш город:
    Россия, Липецк
    Address:
    Lipetsk, Russia
    Country:
    Location on Map:
    @golfstream, еще про 54-ФЗ уже задумывался ?
     
  5. golfstream

    golfstream Новичок

    Сообщения:
    13
    Ваш город:
    Москва, Россия
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Если в плане интеграции онлайн кассы, то нет. Если честно про аспект оплаты я не думал вообще. Пока делаю функционал корзина, заказ, поиск товаров, фильтры. Да и проект это не коммерческий я на нем учусь разработке в Symfony
     
  6. golfstream

    golfstream Новичок

    Сообщения:
    13
    Ваш город:
    Москва, Россия
    Address:
    Moscow, Russia
    Country:
    Location on Map:
    Решил проблему таким способом (криво или нет, судить вам):

    Вместо связи 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(),
            ));
        }
    
     
    Последнее редактирование: 13 окт 2017 в 09:15