试图在laravel会话foreach中获取非对象的属性“id”

Posted

技术标签:

【中文标题】试图在laravel会话foreach中获取非对象的属性“id”【英文标题】:Trying to get property 'id' of non-object in laravel session foreach 【发布时间】:2018-12-30 16:48:19 【问题描述】:

我正在练习 laravel,现在我在会话主题中

这是我的控制器

public function set(Request $request)
   $product = Product::findOrFail($request->input('id'));
   session()->put('product', $product);
   return redirect()->route('cart');
 

当我尝试在我的刀片上回显session()->get('product') 时,它会产生


  "id":9,
  "name":"Lorem ipsum dolor sit amet",
  "description":"Proin pretium, mauris id convallis tempus, lorem enim tincidunt nulla, vel pharetra sapien odio eget ligula. Sed maximus, massa sit amet condimentum bibendum, nisi ante vestibulum ipsum, ut ornare justo lorem mollis justo.",
  "price":"22.21",
  "cover_image":"JRwg9TSKTvUTvuij.jpg",
  "created_at":"2018-07-20 03:47:57",
  "updated_at":"2018-07-20 03:47:57"

但是当我尝试使用 foreach 来使用它时

@foreach(session()->get('product') as $key)
        $key->id
@endforeach

它显示Trying to get property 'id' of non-object的错误

有人可以指导我为什么会出现此错误,谢谢。

【问题讨论】:

【参考方案1】:

如果你试图从一个对象中获取单个值,你可以得到这样的结果。

 session()->get('product')->id 

或者如果您想打印所有数据,首先您必须将对象转换为数组,然后使用 foreach。

@foreach (session()->get('product')->toArray() as $key => $value) 
  $key :  $value  </br> 
@endforeach

【讨论】:

如果我使用 toJson() 而不是 toArray() 会怎样 如何从@Shaan Ansari 视图中的对象中获取单个值 喜欢这个 session()->get('product')->id 我使用这个返回视图('cart.index')->with('product',session()->get('product')->toJson());我如何在刀片模板上打印它 为什么要使用toJson() 数据都已经是json格式了。如果你想使用像 foreach 这样的循环来检索数据,你已经将它转换成一个数组()。【参考方案2】:

您正在尝试迭代一个对象。当您尝试这样做时,您会从对象中获取公共属性。在您的示例中,$key 是这些属性之一,而不是模型本身。

当您 echo 调用模型 __toString 时,它会将序列化模型返回为 json。

如果你想要那个模型的id,你可以像往常一样抓住它。 session('product')-&gt;id

如果您愿意,可以将模型序列化为数组:

foreach ($model->toArray() as $key => $value) 
    ...

【讨论】:

但是有没有办法让我循环使用它?我只想显示会话中的所有数据 循环遍历什么...它的模型,你想显示什么? 所有这些 "id":9, "name":"Lorem ipsum dolor sit amet", "description":"Proin pretium, mauris id convallis tempus, lorem enim tincidunt nulla, vel pharetra sapien odio eget ligula. Sed m​​aximus, massa sit amet condimentum bibendum, nisi ante vestibulum ipsum, ut ornare justo lorem mollis justo.", "price":"22.21", "cover_image":"JRwg9TSKTvUTvuij.jpg", "created_at":" 2018-07-20 03:47:57", "updated_at":"2018-07-20 03:47:57" 然后显示session()-&gt;get('product')为什么要循环 这些是模型Laravel Docs 5.6 - Eloquent - Serialization - Serializing to Arrays的属性【参考方案3】:

您正在遍历您的单个对象,但您似乎需要做的是:

 session()->get('product')->id 

如果你想循环,那么你可以这样做:

@foreach (session()->get('product')->toArray() as $key => $value) 
      $key :  $value 
@endforeach

这将导致:

id: 9
name: Lorem ipsum dolor sit amet
description: Proin pretium, mauris id convallis tempus, lorem enim tincidunt nulla, vel pharetra sapien odio eget ligula. Sed maximus, massa sit amet condimentum bibendum, nisi ante vestibulum ipsum, ut ornare justo lorem mollis justo.
price: 22.21
cover_image: JRwg9TSKTvUTvuij.jpg
created_at: 2018-07-20 03:47:57
updated_at: 2018-07-20 03:47:57

但是,作为旁注,这是一种不好的做法,因为您将视图与会话条目相结合。理想情况下,您的视图只需将产品对象作为视图参数并直接使用它。这样,您可以从会话或数据库查询中传递该对象。

【讨论】:

嘿,我能问个问题吗 @Beginner 你可以 顺便说一句,先生,我正在做一个添加到购物车的功能,就像在这里shop.laracom.net 我做对了吗?在我刷新页面后,购物车号码没有重置它仍然是一样的。这正是我想要达到的目标,先生 所以我的计划是将它存储在一个会话中,然后在视图中循环遍历它。 会话将为特定用户持续存在。如果您不希望这样,请使用session()-&gt;flash 将其仅保留用于单个请求。但是,正如我所说,您应该确定通过控制器发送到视图的内容,而不是让视图直接访问会话。在您的控制器中使用return view(...)-&gt;with('product', session()-&gt;get('product') 并在视图中使用$product。另一方面,如果您想在会话中存储多个产品,则使用数组,例如session()-&gt;put('products', []) 然后附加到它并再次存储它。【参考方案4】:

试试这个方法:

@foreach(session()->get('product') as $key)
    $key['id']
@endforeach

【讨论】:

通过以数组格式获取对象数据,您什么也得不到:-)

以上是关于试图在laravel会话foreach中获取非对象的属性“id”的主要内容,如果未能解决你的问题,请参考以下文章

在Laravel 5.6中尝试获取非对象属性时出错

试图在 laravel 5.5 中获取非对象的属性

试图获得非对象的财产“价格”

试图在 Laravel 4 中获取非对象的属性

试图在laravel中获取非对象的属性'expiry_date'

错误:试图在 Laravel 中获取属性 ID 错误(非对象)