属性 [国家/地区] 在此集合实例上不存在

Property [countries] does not exist on this collection instance

我正在尝试通过 eloquent 创建一个下拉菜单,从那里我可以使用下拉菜单转到次大陆,然后从次大陆转到具有子下拉菜单的国家/地区。关系是次大陆有很多国家.

型号

次大陆

class Subcontinent extends Model
{
    protected $guarded = [];

    public function countries()
    {
        return $this->hasMany(Division::class, 'country_name', 'id');
    }
}

国家

class Division extends Model
{
   protected $table = 'divisions';
   protected $fillable = [
       'country_name', 'subcontinent_id'
   ];

   public function subcontinent()
   {
       return $this->belongsTo(Subcontinent::class, 'country_name', 'id');
   }
}

table国名是division,型号也是Division

Table country/division

Schema::create('divisions', function (Blueprint $table) {
    $table->id();
    $table->string('country_name');
    $table->bigInteger('subcontinent_id');
    $table->timestamps();
});

数据库形成

$subcontinents = Subcontinent::orderBy('id', 'DESC')->get();

但是当我尝试调用 dd($subcontinents->countries) 时它给我 属性 不存在错误。

"Property [countries] does not exist on this collection instance."

$subcontinents = Subcontinent::find(1);

dd 仍然给出空值。我怎样才能将次大陆呼叫到国家!

你对关系法中的第二个和第三个选项有误解。对于 belongsTo 关系,第二个参数是子 table 的外键,第三个参数是父 table 的主键或引用键。 你的部门模型关系应该是

public function subcontinent()
{
    return $this->belongsTo(Subcontinent::class, 'subcontinent_id', 'id');
}

对于 hasMany 关系,第二个参数是子 table 中的外键。对于次大陆模型,关系为

public function countries()
{
    return $this->hasMany(Division::class, 'subcontinent_id', 'id');
}

当您使用 $subcontinents = Subcontinent::orderBy('id', 'DESC')->get(); 时,您得到的是一个集合,而不是一个对象。您必须循环才能从中获取值和关系数据。

foreach($subcontinents as $subcontinent) {
    $subcontinent->$subcontinent_name;
    $subcontinent->countries;
}

当您使用 $subcontinents = Subcontinent::find(1); 时,您会得到一个对象。您可以直接访问它的值。只需更新关系方法。然后您将在 $subcontinents->countries 之前获得值。