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

Sae*_*imi 0 relationship stdclass categories laravel

嗨,我正在从事laravel培训项目。尝试获取每个产品类别名称时,模型和关系存在问题。
这是我的产品型号

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

和我的类别模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

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

   public function products()
   {
      return $this->hasMany('App\Product');
   }
}
Run Code Online (Sandbox Code Playgroud)

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

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

当我运行页面时,出现此错误

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

谁能告诉我是什么原因导致此错误?


这里更新的是表结构
Products:id,name,category_id-> unsigned()
Categories:id,name
,这是我用来获取$ products的代码

    $user_id = Auth::user()->id;
    $products = DB::table('products')->where('user_id', $user_id)->paginate(5);
    return view('my.products.index')->withProducts($products);
Run Code Online (Sandbox Code Playgroud)

Jon*_*hon 5

您的问题是您使用的是Laravel的查询生成器而不是Eloquent,但是您将结果视为Eloquent。

当您这样做时:

$products = DB::table('products')->where('user_id', $user_id)->paginate(5);
Run Code Online (Sandbox Code Playgroud)

$products变量将包含一个Paginator实例,其中包含您的项目为实例stdClass。如果您希望能够使用Eloquent进行此操作,则应尝试执行以下操作:

$products = Product::with('category')->where('user_id', $user_id)->paginate(5);
Run Code Online (Sandbox Code Playgroud)

这将确保在分页器中返回的项目是您的ProductEloquent模型的实例,并预先category加载了该关系(即,它将Product使用一个查询而不是5个查询(每个查询一个Product)来为每个返回的内容加载类别关系。

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