Laravel 使用多对多关系加载数据

Laravel data loading using many to many relationhips

尝试在 laravel 中使用多对多关系获取数据。我的文件和代码描述如下。

型号:

Grade.php

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Grade extends Model{
    protected $guarded = [];
    public function specifications(){
        return $this->belongsToMany(Specification::class)->withTimestamps();
    }
    public function gnames(){
        return $this->belongsToMany(Gname::class)->withTimestamps();
    }
    public function gsizes(){
        return $this->belongsToMany(Gsize::class)->withTimestamps();
    }
}

Specification.php

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Specification extends Model{
    protected $guarded = [];

    public function grades(){
        return $this->belongsToMany(Grade::class)->withTimestamps();
    }
    public function gnames(){
        return $this->belongsToMany(Gname::Class)->withTimestamps();
    }
    public function gsizes(){
        return $this->belongsToMany(Gsize::class)->withTimestamps();
    }
}

我在SpecificaitonController中的index方法是这样的,

public function index(Specification $specification){        
  $specifications = Specification::with('grades:id,grade')->first();
  // dd($specifications);
  return view('/home.specification.index', compact('specifications'));
}

当我 dd($specificaitons);输出将是,

我的目的是通过“规格 &级”车型。视图如下。

@forelse ($specifications as $specification)
  <tbody>
    <tr>
      <td class="text-left">{{ $specification->id }}</a></td>
      <td class="text-left">{{ $specification->specification_no }}</td>
      <td class="text-left">{{ $specification->grades->grade }}</td>
      <td><a href="/specifications/{{ $specification->id }}/edit">Edit</a></td>
    </tr>                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
  </tbody>
@empty
  <p><strong>No data to preview</strong></p>
@endforelse

最后我得到了以下错误。

ErrorException Trying to get property 'id' of non-object

我尝试了很多方法来摆脱这种困惑。我想知道我采用的是正确的方法,如果有任何帮助可以识别此错误,我们将不胜感激。

在规范模型中 public 函数 grades(){ return $this->belongsToMany(Grade::class,'grades','id') ->withTimestamps();}

根据你对我评论的回复,问题解决了。在您的控制器中,您正在使用 ->first() 而应该使用 ->get() 来获得 collection 规格,然后 foreach/forelse collection 在 blade.

public function index(Specification $specification){        
  $specifications = Specification::with('grades:id,grade')->get();
  return view('/home.specification.index', compact('specifications'));
}