Laravel: 如何将 'belongs to' 加载为动态 属性?

Laravel: How to load a 'belongs to' as a dynamic property?

我有 2 个模型:userstate。一个州是用户居住的地方,所以一个州有很多用户,一个用户属于一个州。

在我的用户模型中我有一个归属关系,如下:

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;