Home > Back-end >  Property [countries] does not exist on this collection instance
Property [countries] does not exist on this collection instance

Time:11-02

I am trying to create a drop down menu by with eloquent from where I can go to subcontinent with drop down and subcontinent to countries with sub-dropdown. The relationship is Subcontinent has many countries.

Models

Subcontinent

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

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

Country

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

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

The table name of country is divisions and the model name is also Division.

Table country/division

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

Database formation

enter image description here

enter image description here

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

But when I try to call dd($subcontinents->countries) it gives me property does not exist error.

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

with $subcontinents = Subcontinent::find(1);

the dd still gives null value. How can I call subcontinents to countries!

CodePudding user response:

you have misconception about second and third option in relationship method. for belongsTo relationship, the second argument is the foreign key of the child table and the third argument is the primary key or the reference key of the parent table. your Division model relationship should be

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

and for hasMany relationship the second argument is the foreign key in the child table. For SubContinent model the relationship would be

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

and when you use $subcontinents = Subcontinent::orderBy('id', 'DESC')->get(); you get a collection, not an object. you have to loop over to get values and relationship data from this.

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

and when you use $subcontinents = Subcontinent::find(1); you get an object. you can directly access its values. just update the relationship method. and you will get values by $subcontinents->countries then.

  • Related