我已经研究过这个答案:Laravel Eloquent ORM relationship naming conventions
这也是Query foreign key data from Blade template
但仍然无法解决我的问题。 我有两个模型:产品和类别,我想在我的刀片页面上显示产品数据及其类别[name ofcourse]。我知道可以通过将它添加到我的控制器中的返回数据来实现这一点,但是我想利用Eloquent来做,但是我收到了错误。
这是我的代码:
产品型号
protected $table = 'product_details';
public function category() {
return $this->belongsTo('App\category', 'category_id');
}
类别模型
protected $table = 'category';
public function product() {
return $this->hasMany('App\product');
}
ProductController的
public function index()
{
$products = product::select('id', 'product_name', 'category_id', 'is_active', 'created_at', 'updated_at')->get();
return view('admin/product/index', compact('products'));
}
Index Blade Page
{{ $product->category->category_name }}
表
product_details
id
product_name
catgory_id
类别
id
category_name
我得到错误:
尝试获取非对象的属性
答案 0 :(得分:0)
可能您使用的是错误的型号名称,默认情况下,型号名称为:
App\Foobar
将类别的“C”字母大写
protected $table = 'product_details';
public function category() {
return $this->belongsTo('App\Category', 'category_id');
}
将产品的“P”字母大写
protected $table = 'category';
public function product() {
return $this->hasMany('App\Product');
}
答案 1 :(得分:0)
由于产品表中category_id
的值为null
或其他id
值(类别表中不存在),因此缺少类别。您可以通过以下方式检查刀片中的缺失值:
{{ $product->category->category_name or 'Unknown Category' }}
答案 2 :(得分:0)
这就是我看到它的方式。
您正在使用 get()来检索将返回数组的产品,以便您访问类别集合,您必须遍历每个产品以检索其类别。如果您只想要一种产品,则可以使用 first()。
我建议您使用预先加载来获取类别以防止 n + 1 查询问题。我认为在某种程度上它也可以帮助阻止尝试获取非对象的属性。查询现在将是
$products = product::with('category')->select('id', 'product_name', 'category_id', 'is_active', 'created_at', 'updated_at')->get();
也可能是产品没有相关的类别记录,如果您强制执行外键约束,我认为这种记录是不可能的。但如果是这种情况,你可以试试php7 ull Coalesce Operator。
{{ $product->category->category_name ?? 'Not Available'}}
答案 3 :(得分:0)
在您的控制器中,您写道:
$products = product::select('id', 'product_name', 'category_id', 'is_active', 'created_at', 'updated_at')->get();
但是在您的刀片文件中,您正在致电:
{{ $product->category->category_name }}
您是否在刀片文件中编写了 foreach循环?例如:
@foreach ($products as $product)
{{ $product->category->category_name }}
@endforeach
否则你应该首先调用 - >而不是 - >获取并更正你的拼写错误。因此 ProductController 上的代码将是:
public function index()
{
$products = product::select('id', 'product_name', 'category_id', 'is_active', 'created_at', 'updated_at')->get();
return view('admin/product/index', compact('products'));
}
虽然您的刀片页上的代码是:
{{ $product->category->category_name }}