添加订单后的Doctrine购物车:未定义的索引

时间:2017-09-17 09:50:39

标签: php session doctrine-orm nette

我在Doctrine和Nette Framework中编程购物车。 有addItem方法:(添加到会话购物车)

public function addItem($item) {
    $cart = $this->getCartSection();
    $product = $this->product_facade->getProduct($item['voucher_id']);

    if (isset($cart->cart_items[$product->getId()])) {
        $cart->cart_items[$product->getId()]['amount'] += $item['amount'];
    } else {
        $cart->cart_items[$product->getId()] = array(
            'voucher' => $product,
            'amount' => $item['amount']
        );
    }
}

还有一种向db添加订单的方法

public function add($creator, $data) {    
    $order = new Orders();
    $order->setPrice($data['price']);
    $order->setStatus($this->status_facade->getStatus(self::NEW_STATUS_ID));
    $order->setPayment($this->payment_facade->getPayment($data->payment));
    $order->setDate(new DateTime());
    $order->setUser($creator);

foreach ($data['cart'] as $item) {      
      $order_product = new OrdersProduct();
      $order_product->setQuantity($item['amount']);
      $order_product->setProduct($item['voucher']);

      $order->addItem($order_product);
    }

    $this->em->persist($order);
    $this->em->flush();
}

点击按钮后出现错误'添加到订单'

Undefined index: 00000000659576f8000000004032b93e

但我知道哪里出错了。有一个方法add,此方法从会话中获取Product实体。

$order_product->setProduct($item['voucher']);

我需要产品实体在会议中因为我想在购物车中计算总价。 如果我使用数字或setProduct调用添加方法$item['voucher']->getId()(此变量是来自Product的实体)

$order_product->setProduct(
  $this->product_facade->getProduct(4)
);

没关系,但我不知道,为什么我从会话中呼叫产品实体是wronk。这是相同的方法,结果相同。

你可以帮我解决问题吗?你知道为什么是wronk吗?

谢谢,我希望你理解我。

2 个答案:

答案 0 :(得分:1)

您无法将实体保存到会话中。学说使用Identity Map

仅将实体ID保存到会话,并在使用之前从数据库中读取实体。如果您在会话中需要更多数据,请不要使用实体。重新实现DTO

答案 1 :(得分:0)

实际上,您可以在会话中存储实体。您可以在Doctrine docs中阅读更多内容:

http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/cookbook/entities-in-session.html

从会话中检索实体时,您需要在merge上调用EntityManager

$entity = $this->em->merge($entityFromSession);