【问题标题】:Multiple collections in an array (session variable) — Property does not exist数组中的多个集合(会话变量)——属性不存在
【发布时间】:2017-12-17 21:08:54
【问题描述】:

如果用户是访客,我正在尝试获取会话变量。该变量称为“cart”,设置如下:

$product = new Collection((object) [
    'product_id' => $request->pId,
    'amount' => $request->amount,
    'variations' => $variations
]);

Session::push('cart', $product);

然后我稍后再取它:

if(Auth::check()){
    $cartProducts = ShoppingCartItem::where('user_id', '=', Auth::user()->id)->get();
}else{
    $cartProducts = Session::get('cart');
}

foreach($cartProducts as $product){
    dd($product);
    $totalAmount += $product->amount;
    $totalPrice += (PriceHelper::getProductPrice($product->product->id, $product->amount));
}

这里的问题是dd($product) 仍然输出一个数组(我假设的会话变量数组),这意味着例如$product->amount 不存在。

这是dd($product)的输出:

【问题讨论】:

  • 所以问题是即使您已登录 Auth::check() 返回 false(从而导致此问题)?
  • 不,这很好用。当我注销时,我正在尝试从会话中获取我的购物车中的产品,这工作正常。不起作用的是我不能使用$product->amount,即使“金额”在$product 变量中

标签: arrays laravel session object


【解决方案1】:

您可以使用get() 访问这些值:

foreach ($cartProducts as $product) {
    $totalAmount += $product->get('amount');
    $totalPrice += PriceHelper::getProductPrice($product->get('product_id'), $product->get('amount'));
}

或作为数组:

foreach ($cartProducts as $product) {
    $totalAmount += $product['amount'];
    $totalPrice += PriceHelper::getProductPrice($product['product_id'], $product['amount']);
}

或者您可以在集合上使用sum() 而不是使用foreach

$cartProducts = collect(Session::get('cart'));

$totalAmount = $cartProducts->sum('amount');
$totalPrice = $cartProducts->sum(function ($product) {
    return PriceHelper::getProductPrice($product['product_id'], $product['amount']);
});

编辑

如果您需要 $product 作为对象,您可以执行以下操作以快速解决:

$cartProducts = collect(Session::get('cart'))->map(function ($item) {
    return (object)$item->toArray();
});

希望这会有所帮助!

【讨论】:

  • 这很好用,谢谢。但问题是我必须创建两个视图(购物车视图)。例如,一种使用$product->title(从数据库中获取的产品),另一种使用$product["title"](从会话中获取的产品)。是否可以使用相同的符号 ($product->title,...) 从该会话数组中获取值?
  • @Scarwolf 啊,对不起,我没有意识到你需要它成为一个对象。我已经更新了我的答案。
  • 您知道是否可以以某种方式使用这些关系?例如,我的 ShoppingCartItem 模型与产品有关系,以获取它的名称、价格等。当我在 Session 中保存产品 ID 时,是否有可能以某种方式执行 $product->product->title 之类的操作,其中 $product 不是 Eloquent 模型,而是一些值,包括存储在会话中的产品 ID?
  • @Scarwolf 我是否假设您也有一个 ShoppingCart 模型或者它只是 ShoppingCartItem 模型?
  • @Scarwolf 您可能会为购物车中的每个产品新建一个ShoppingCartItem,将会话中的数据填充(不要保存),Product 关系应该可以正常工作因为这将是一个belongsTo 关系,不需要ShoppingCartItem id。如果会话购物车中有很多产品并且您希望它更高效,那么您可以手动从购物车中获取所有 Products 并在 ShoppingCartItem 模型上使用 setRelation(),这样您就不会这样做每个产品的单独查询。
猜你喜欢
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-31
  • 1970-01-01
  • 2015-11-10
  • 2018-05-12
相关资源
最近更新 更多