Saud
Saud

Reputation: 878

Property [users] does not exist on this collection instance

This error has been posted here several times but I'm encountering something a little different. I have two Tables named users and user_type. And users uses a foreign key from user_type. I have to fetch all users and their types, I'm using Laravel's Eloquent ORM to define relationships, this is a one to one relation.

Users Model:

/**
 * Get the user type that user has.
 */
public function users(){
    return $this->belongsTo('App\Models\UserType', 'ut_id', 'id');
}

UserType Model:

/**
 * The primary key associated with the table.
 *
 * @var string
 */
protected $primaryKey = 'ut_id';

/**
 * Get the user associated with the user type.
 */
public function users(){
    return $this->hasOne('App\Models\Users', 'user_type_id', $this->primaryKey);
}

Fetching Controller:

$users = Users::all()->users;

According to Laravel ORM one-to-one I can access this method as a property, but it's showing me the defined error. I've also tried to access it as a method but it's saying:

Method Illuminate\Database\Eloquent\Collection::users does not exist.

I've also tried to fetch them by join() but it's returning only a few users, I don't know why:

$users = Users::where('id', '>', '0')
        ->join('user_type', 'user_type.ut_id', '=', 'users.id')
        ->select([
            'user_type.ut_name',
            'users.*'
        ])->get();

Can someone tell me what I'm doing wrong?

P.s: I just want to show all the users with their respective types

Upvotes: 1

Views: 9989

Answers (3)

Qonvex620
Qonvex620

Reputation: 3972

You had missed the exact foreign key between your users table and usertypes table.

First, you defined the that the foreign key of your user table is 'ut_id' base of what you had in your belongsTo relationship. On this one

/**
 * Get the user type that user has.
 */
public function users(){
    return $this->belongsTo('App\Models\UserType', 'ut_id', 'id');
}

Second is that, in your user type model, you used a foreign key to user table named 'user_type_id', which is at first you named it as 'ut_id' in your users table. On this one

/**
 * The primary key associated with the table.
 *
 * @var string
 */
protected $primaryKey = 'ut_id';

/**
 * Get the user associated with the user type.
 */
public function users(){
    return $this->hasOne('App\Models\Users', 'user_type_id', $primaryKey);
}

You have to match this foreign keys you used to solve your problem.

Now, to fetch your all user with their types, your query should look like this.

$users = Users::with('users')->get();

assuming that your user table has this relationship

public function users(){
    return $this->belongsTo('App\Models\UserType', 'ut_id', 'id');
}

and your user types model has this relationshio

public function users(){
    return $this->hasOne('App\Models\Users', 'ut_id', $this->primaryKey);
}

Upvotes: 2

GizmoZa
GizmoZa

Reputation: 106

Your relations seem to be wrong.

Users links to UserType with id to ut_id, but userType links to User with id to user_type_id

I'm pretty sure that it should be this for userTypes

/**
 * Get the user associated with the user type.
 */
public function users(){
    return $this->hasMany('App\Models\Users', 'id', 'user_type_id');
}

and then this for Users

public function userTypes(){
    return $this->belongsTo('App\Models\UserType', 'user_type_id', 'id');
}

Then you can eager load for all the results you want...

$users = Users::where('id', '>', '0')
        ->with('userTypes')
        ->get();

Upvotes: 0

Ramin eghbalian
Ramin eghbalian

Reputation: 2677

in User model

public function type(){
   return $this->hasOne(UserType::class, 'id');
}

in UserType Model

public function users(){
  return $this->belongsToMany(User::class, 'id');
}

Upvotes: 0

Related Questions