雄辩的外键关系不起作用

时间:2017-03-24 17:24:13

标签: php mysql laravel eloquent blade

我已经研究过这个答案: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

我得到错误:

  

尝试获取非对象的属性

4 个答案:

答案 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)

这就是我看到它的方式。

  1. 您正在使用 get()来检索将返回数组的产品,以便您访问类别集合,您必须遍历每个产品以检索其类别。如果您只想要一种产品,则可以使用 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'}}
    

答案 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 }}