Laravel: 如何将 'belongs to' 加载为动态 属性?
Laravel: How to load a 'belongs to' as a dynamic property?
我有 2 个模型:user
和 state
。一个州是用户居住的地方,所以一个州有很多用户,一个用户属于一个州。
在我的用户模型中我有一个归属关系,如下:
public function state()
{
return $this->belongsTo(State::class);
}
当我访问 $user->state
时,我想要数据库查询的结果,但是由于 $user
有一个状态值,它 returns 就是那个。有没有办法通过配置来改变这种行为?
我尝试创建一个 getStateAttribute()
方法,并返回 $this->belongsTo(State::class)
,但 Laravel 不喜欢那样。目前,我可以检索状态对象的唯一方法是通过:
$user->state()->first();
当 属性 名称是两个单词时,问题不存在,例如$user->firstName
,因为我的列名都是蛇形(即没有命名冲突。)
你可以这样做:
- 将用户 table 中的 属性 重命名为不是
state
,例如:user_state
重命名关系以不匹配用户的 属性 例如:
public function stateRelation()
{
return $this->belongsTo(State::class);
}
Laravel 使用系统检查属性而不在模型 class 中声明它们,您应该尽量避免将名称与关系匹配。通常你想要的是存储状态的id在用户table调用它state_id
,然后关系不会与它发生冲突。
使用 $user->state()->first()
不是正确的解决方案,因为您将失去 Eager Loading 功能,这是 100% 推荐的
您应该将用户table中的状态属性更改为state_id,然后您可以像
一样查询
$user = User::find(useridhere)->with('state');
$user->state->country;
我有 2 个模型:user
和 state
。一个州是用户居住的地方,所以一个州有很多用户,一个用户属于一个州。
在我的用户模型中我有一个归属关系,如下:
public function state()
{
return $this->belongsTo(State::class);
}
当我访问 $user->state
时,我想要数据库查询的结果,但是由于 $user
有一个状态值,它 returns 就是那个。有没有办法通过配置来改变这种行为?
我尝试创建一个 getStateAttribute()
方法,并返回 $this->belongsTo(State::class)
,但 Laravel 不喜欢那样。目前,我可以检索状态对象的唯一方法是通过:
$user->state()->first();
当 属性 名称是两个单词时,问题不存在,例如$user->firstName
,因为我的列名都是蛇形(即没有命名冲突。)
你可以这样做:
- 将用户 table 中的 属性 重命名为不是
state
,例如:user_state
重命名关系以不匹配用户的 属性 例如:
public function stateRelation() { return $this->belongsTo(State::class); }
Laravel 使用系统检查属性而不在模型 class 中声明它们,您应该尽量避免将名称与关系匹配。通常你想要的是存储状态的id在用户table调用它state_id
,然后关系不会与它发生冲突。
使用 $user->state()->first()
不是正确的解决方案,因为您将失去 Eager Loading 功能,这是 100% 推荐的
您应该将用户table中的状态属性更改为state_id,然后您可以像
一样查询 $user = User::find(useridhere)->with('state');
$user->state->country;