Olá, estou trabalhando em um projeto de treinamento laravel. estou tendo problemas com modelos e relacionamentos quando tento obter o nome de cada categoria de produto.
Aqui está o meu modelo de produto
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
public function category()
{
return $this->belongsTo('App\Category');
}
}
e meu modelo de categoria
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
protected $table = 'categories';
public function products()
{
return $this->hasMany('App\Product');
}
}
quando tento obter o nome da categoria para cada produto como este
@foreach($products as $product)
<tr>
<td>{{ $product->id }}</td>
<td>{{ $product->name }}</td>
<td>{{ $product->category->name }}</td>
</tr>
@endforeach
enquanto executo a página, recebo este erro
Undefined property: stdClass::$category (View: /var/www/html/projectname/resources/views/my/products/index.blade.php)
Alguém pode me dizer o que está causando esse erro?
update
aqui está a estrutura da tabela
Products: id, name, category_id-> unsigned ()
Categories: id, name
e aqui está o código que eu uso para obter $ products
$user_id = Auth::user()->id;
$products = DB::table('products')->where('user_id', $user_id)->paginate(5);
return view('my.products.index')->withProducts($products);
O problema é que você está usando o construtor de consultas do Laravel em vez do Eloquent, mas está tratando o resultado como se fosse o Eloquent.
Quando você faz:
$products = DB::table('products')->where('user_id', $user_id)->paginate(5);
A $products
variável conterá uma Paginator
instância, que contém seus itens como instâncias de stdClass
. Se você quiser fazer isso com o Eloquent, deve tentar algo assim:
$products = Product::with('category')->where('user_id', $user_id)->paginate(5);
Isso garantirá que os itens retornados no paginador sejam instâncias de seu Product
modelo Eloquent, com o category
relacionamento carregado antecipadamente (ou seja, ele carregará o relacionamento de categoria para cada Product
retornado usando uma consulta, em vez de 5 consultas, uma para cada Product
).
Você deve então conseguir acessar $product->category->name
.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras