我在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吗?谢谢,我希望你理解我。
答案 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);