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' }}

我是这样看的。

  1. 您正在使用 get() 检索您的产品,这将 return 一个数组,以便您访问必须循环的类别集合通过每一个产品来检索它的类别。如果您只想要一种产品,可以使用 first()

  2. 我建议您使用预先加载来获取您的类别,以防止 n+1 查询问题。我认为在某种程度上它也可以帮助防止尝试获取非对象属性。查询现在将是

    $products = product::with('category')->select('id', 'product_name', 'category_id', 'is_active', 'created_at', 'updated_at')->get();
    
  3. 也可能是产品没有相关的类别记录,如果您强制执行外键约束,我认为这是不可能的。但如果是这种情况,您可以尝试 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 }}