eloquent 中的外键关系不起作用
Foreign Key relationship in eloquent not working
我查看了这个答案:Laravel Eloquent ORM relationship naming conventions
还有这个
但是还是没能解决我的问题。
我有两个模型:产品和类别,我想在我的 blade 页面上显示产品数据及其类别 [name ofcourse]。我知道可以通过将它添加到我的控制器中的 return 数据来做到这一点,但是我想利用 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');
}
产品控制器
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'));
}
索引Blade页数
{{ $product->category->category_name }}
表格
product_details
id
product_name
catgory_id
类别
id
category_name
我得到的错误:
Trying to get property of non-object
可能您使用的型号名称有误,默认型号名称为:
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');
}
类别缺失,因为产品 table 中 category_id
的值是 null
或类别 table 中不存在的其他 id
值。您可以通过以下方式检查 blade 中的缺失值:
{{ $product->category->category_name or 'Unknown Category' }}
我是这样看的。
您正在使用 get() 检索您的产品,这将 return 一个数组,以便您访问必须循环的类别集合通过每一个产品来检索它的类别。如果您只想要一种产品,可以使用 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();
但是在您的 blade 文件中您调用的是:
{{ $product->category->category_name }}
您是否在 blade 文件中编写了 foreach 循环?例如:
@foreach ($products as $product)
{{ $product->category->category_name }}
@endforeach
否则你应该调用 ->first 而不是 ->get 并更正你的拼写错误。所以 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'));
}
虽然您 blade 页面上的代码是:
{{ $product->category->category_name }}
我查看了这个答案:Laravel Eloquent ORM relationship naming conventions
还有这个
但是还是没能解决我的问题。 我有两个模型:产品和类别,我想在我的 blade 页面上显示产品数据及其类别 [name ofcourse]。我知道可以通过将它添加到我的控制器中的 return 数据来做到这一点,但是我想利用 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');
}
产品控制器
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'));
}
索引Blade页数
{{ $product->category->category_name }}
表格
product_details
id
product_name
catgory_id
类别
id
category_name
我得到的错误:
Trying to get property of non-object
可能您使用的型号名称有误,默认型号名称为:
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');
}
类别缺失,因为产品 table 中 category_id
的值是 null
或类别 table 中不存在的其他 id
值。您可以通过以下方式检查 blade 中的缺失值:
{{ $product->category->category_name or 'Unknown Category' }}
我是这样看的。
您正在使用 get() 检索您的产品,这将 return 一个数组,以便您访问必须循环的类别集合通过每一个产品来检索它的类别。如果您只想要一种产品,可以使用 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();
但是在您的 blade 文件中您调用的是:
{{ $product->category->category_name }}
您是否在 blade 文件中编写了 foreach 循环?例如:
@foreach ($products as $product)
{{ $product->category->category_name }}
@endforeach
否则你应该调用 ->first 而不是 ->get 并更正你的拼写错误。所以 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'));
}
虽然您 blade 页面上的代码是:
{{ $product->category->category_name }}