laravel中的类别关系未定义属性:stdClass ::

时间:2017-02-18 10:35:10

标签: laravel relationship categories stdclass

您好我正在参与laravel培训项目。当我试图获取每个产品类别名称时,我遇到了模型和关系问题。
这是我的产品型号

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
   public function category()
   {
   return $this->belongsTo('App\Category');
   }
}

和我的分类模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
   protected $table = 'categories';

   public function products()
   {
      return $this->hasMany('App\Product');
   }
}

当我尝试获取每个产品的类别名称时

      @foreach($products as $product)
      <tr>
        <td>{{ $product->id }}</td>
        <td>{{ $product->name }}</td>
        <td>{{ $product->category->name }}</td>
      </tr>
      @endforeach

当我运行页面时,我收到此错误

Undefined property: stdClass::$category (View: /var/www/html/projectname/resources/views/my/products/index.blade.php)

任何人都可以告诉我导致此错误的原因是什么?

更新
这是表结构
产品:id,name,category_id-&gt; unsigned()
分类:id,名称
这是我用来获取$ products

的代码
    $user_id = Auth::user()->id;
    $products = DB::table('products')->where('user_id', $user_id)->paginate(5);
    return view('my.products.index')->withProducts($products);

1 个答案:

答案 0 :(得分:4)

您的问题是您正在使用Laravel的查询构建器而不是Eloquent,但您将结果视为Eloquent。

当你这样做时:

$products = DB::table('products')->where('user_id', $user_id)->paginate(5);

$products变量将包含Paginator个实例,其中包含您的项目stdClass的实例。如果你想用Eloquent做到这一点,你应该尝试这样的事情:

$products = Product::with('category')->where('user_id', $user_id)->paginate(5);

这将确保在paginator中返回的项目是Product Eloquent模型的实例,并且category关系已加载(即,它将加载每个Product的类别关系使用一个查询返回,而不是5个查询,每个Product一个。

然后,您应该可以访问$product->category->name