获取属性(无对象)laravel

时间:2019-10-31 19:43:32

标签: php laravel laravel-5

我有一个带有user_idproduct_id列的推荐表,我试图显示浏览最多的产品,但出现错误

  

试图从视图中获取非对象的属性,

如果我dd($viewed)正确显示了所有产品,但问题是它无法显示产品并抛出错误,那么如何解决此问题的任何想法?

Controller

$viewed = Recommends::with('product')
   ->where('user_id', Auth::user()->id)
   ->select('product_id')
   ->inRandomOrder()
   ->groupBy('product_id')
   ->orderby('product_id', 'DESC')
   ->take(8)
   ->get();

Blade文件

@foreach($viewed as $view)
 <h1>USD: {{$view->product->price}}</h1>
 <h2>USD: {{$view->product->info}}</h2>
@endforeach

当我dd($ viewed)我得到这个

   Collection {#357 ▼
  #items: array:8 [▼
  0 => Recommends {#369 ▼
  #connection: "mysql"
  #table: "recommends"
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:1 [▼
    "product_id" => 39
  ]
  #original: array:1 [▶]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: array:1 [▼
    "product" => product {#387 ▼
      #searchable: array:1 [▶]
      #table: "products"
      #primaryKey: "id"
      #fillable: array:7 [▶]
      #connection: "mysql"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:11 [▶]
      #original: array:11 [▼
        "id" => 39
        "name" => "e"
        "price" => 3
        "info" => "s"

Product.php

 public function recommends()
{
    return $this->hasMany('App\Recommends','product_id');
}

recommends.php

public function product()
{
    return $this->belongsTo('App\Product','product_id');
}

4 个答案:

答案 0 :(得分:0)

您将获得推荐对象的集合,其中包括产品模型。该错误很可能是由于product变量上缺少$view而引起的。可能是由于GroupBy语句所致,或者您可能只是没有将产品附加到该View模型。

在刀片服务器页面上尝试以下操作进行测试:

<h1>USD: {{isset($view->product_id)?$view->product->price: 'No Product Set'}}</h1>
<h2>USD: {{isset($view->product_id)?$view->product->info: 'No Product Set'}}</h2>

答案 1 :(得分:0)

您要在其中传递$ view以及加载查看文件的位置 在您的控制器内部函数中尝试以下操作:

//controller
function abc(){
$viewed = Recommends::with('product')
   ->where('user_id', Auth::user()->id)
   ->select('product_id')
   ->inRandomOrder()
   ->groupBy('product_id')
   ->orderby('product_id', 'DESC')
   ->take(8)
   ->get();
 return view('folder/blade_file_name', compact('viewed'));
}

答案 2 :(得分:0)

您如何附加$ viewed变量进行查看? 我认为最好知道如何进行调试,这样我将尽力为您提供帮助。

检查每个$ view变量是否在控制器中都有$ product。像这样的东西

    foreach($viewed as $view)
    {
        if (!$view->product) {
            dd($view);
        }
    }

如果所有$ viewed集合都有产品,则问题不在数据中,因此我们可以继续进行其他操作。

答案 3 :(得分:0)

如果任何关系数据/变量为空,则将产生相同的错误,因此您将在此处放置条件.........

刀片文件

  @if(!empty($viewed))
    @foreach($viewed as $view)
    <h1>USD: {{$view->product ? $view->product->price : ''}}</h1>
    <h2>USD: {{$view->product ? $view->product->info : ''}}</h2>
    @endforeach
  @endif