我已经研究了这个答案: Laravel 雄辩的 ORM 关系命名约定
这个也是从刀片模板查询外键数据
但仍然无法解决我的问题。我有两个模型:产品和类别,我想在我的刀片页面上显示产品数据及其类别 [当然是名称]。我知道可以通过将其添加到控制器中的返回数据来做到这一点,但是我想利用 Eloquent 来做到这一点,但是我收到错误。
这是我的代码:
产品型号
protected $table = 'product_details';
public function category() {
return $this->belongsTo('Appcategory', 'category_id');
}
类别模型
protected $table = 'category';
public function product() {
return $this->hasMany('Appproduct');
}
产品控制器
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 }}
表
product_details
id
product_name
catgory_id
类别
id
category_name
我得到的错误:
尝试获取非对象的属性
由于产品表中category_id
的值null
或类别表中缺少的其他id
值,因此缺少类别。您可以通过以下方式检查边栏选项卡中的缺失值:
{{ $product->category->category_name or 'Unknown Category' }}
可能您使用了错误的模型名称,默认情况下,模型名称为:
AppFoobar
将类别的"C"字母大写
protected $table = 'product_details';
public function category() {
return $this->belongsTo('AppCategory', 'category_id');
}
将产品的"P"字母大写
protected $table = 'category';
public function product() {
return $this->hasMany('AppProduct');
}
这就是我的看法。
-
您正在使用 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'}}
在控制器中,您写道:
$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
否则,您应该调用 ->first 而不是 ->get 并更正您的拼写错误。因此,产品控制器上的代码将是:
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 }}