I have 2 models: user
and state
. A state is where the user lives, so a state has many users, and a user belongs to one state.
In my user model I have a belongs-to relationship, as follows:
public function state()
{
return $this->belongsTo(State::class);
}
When I access $user->state
I want the result of the db query, however since $user
has a state value, it returns that instead. Is there a way to change this behaviour through configuration?
I tried creating a getStateAttribute()
method, and returning $this->belongsTo(State::class)
, but Laravel doesn't like that. At the moment, the only way I can retrieve the state object is through:
$user->state()->first();
The problem doesn't exist when the property name is two words, e.g. $user->firstName
, because my column names are all snake case (i.e. there are no naming conflicts.)
You can do:
state
, for example: user_state
Rename the relation to not match the user's property for example:
public function stateRelation()
{
return $this->belongsTo(State::class);
}
Laravel uses a system to check for properties without declaring them in the Model class, you should try to avoid matching names with relations. Usually what you want is to store the id of the sate on the users table calling it state_id
, then the relation will not collide with it.
Using $user->state()->first()
is not a correct solutions since you will lost the Eager Loading feature, which is 100% recommended