Sredny M Casanova
Sredny M Casanova

Reputation: 5053

Trouble getting attribute of relation in Laravel

I'm having a trouble with a relation in Laravel 5. the thing is that I have a table User and that user belongs to a Group for that, in the User model I have this:

public function group(){
    return $this->belongsTo('App\models\Group');
}

The model Group have this attributes: name,unity,level, init_date. I also put there a default function to return a group as String, this is the code:

public function __toString(){
        return $this->name.' Unity '.$this->unity;
    }

So, the thing that in a view a have many users and for each of them I want to display the unity, name,date. When I call $user->group it returns me correctly the name and the unity in a String (because the _toString function) that means that he is really querying the group perfectly, but then, when I want to access a simple attribute as unity,date,or name with $user->group->name Laravel gives me this error:

Trying to get property of non-object

I even tried $user->group()->name then I gets: Undefined property: Illuminate\Database\Eloquent\Relations\BelongsTo::$name

Edited:

The model User:

class User extends Model implements AuthenticatableContract, CanResetPasswordContract {

    use Authenticatable, CanResetPassword;

    protected $table = 'users';

    protected $fillable = ['email', 'password','estate','filial_id','perfil_id','rol','cat_teacher'];

    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = ['password', 'remember_token'];

    public function __toString(){
        return $this->email;
    }

    public function filial(){
            return $this->belongsTo('App\models\Filial');
    }

    public function perfil(){
        return $this->belongsTo('App\models\Perfil','perfil_id');
    }

    public function grupo(){
        return $this->belongsTo('App\models\Group','group_id','id');
    }
}

The model Group:

class Group extends Model {


protected $table = 'groups';

protected $fillable = ['name','unity','date'];

public function filiales() {
   return $this->belongsTo('App\models\Filial');
}

public function teacher(){
    return $this->belongsTo('App\models\User','teacher_id');
}

public function users() {
    return $this->hasMany('App\models\User');
}
}

Then, in the controller I made a dd($users) and there not appear the relations, appears other relations but not this one. In the view I want to print some of the attributes in a table, for that I have:

<td>{{$user->group}}</td>
<td>{{$user->group->unity}}</td>

The first line works perfectly, and I don´t know why.

Upvotes: 2

Views: 9712

Answers (1)

Tim Lewis
Tim Lewis

Reputation: 29258

The reason you're unable to return your group's name is that ->group() returns an instance of the query builder, and not an eloquent collection/object. Since a user belongs to a single group, modify your code in one of these two ways:

public function group(){
    return $this->belongsTo('App\models\Group')->first();
}

And then access the group using one of the following methods:

$user = User::with("group")->where("id", "=", 1)->first();
$group = $user->group;
echo $group->name;

// OR

$user = User::where("id", "=", 1)->first();
$group = $user->group();
echo $group->name;

Or, leave the group() function as it is and access ->group()->first() on your $user object:

$user = User::where("id", "=", 1)->first();
$group = $user->group()->first();
echo $group->name;

Any of the above methods should properly return your group object's name (or other attributes). Check the Eloquent Documentation for detailed explanations on how to access these objects.

Upvotes: 4

Related Questions