0

我在 Doctrine 和 Nette 框架中编写购物车程序。有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']
        );
    }
}

还有一种添加订单到数据库的方法

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)调用 add 方法

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

没关系,但我不知道,为什么我从会话中调用产品实体是错误的。这是相同的方法具有相同的结果。

你能帮我解决问题吗?你知道为什么会出错吗?

谢谢你,希望你能理解我。

4

2 回答 2

1

您不能将实体保存到会话中。Doctrine 使用Identity Map

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

于 2017-09-20T23:51:23.447 回答
0

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

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

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

$entity = $this->em->merge($entityFromSession);
于 2017-09-29T12:18:34.037 回答