首页 文章

Laravel使用Eloquent的关系真的很正确吗?

提问于
浏览
2

我有一个运行Laravel 5.5的项目,我在数据库中有以下表格 .

USERS (
    ID,
    NAME,
    PERMISSION_ID
)

PERMISSIONS (
    ID,
    NAME
)

如果我没错,USERS与PERMISSIONS的关系是1.1(USERS至少有1个权限,最多1个),所以这是一个OneToOne关系 .

在我的用户模型中,我 Build 了以下关系 .

class User extends Authenticatable
{
    public function permission () {
        return $this->hasOne('App\Models\Permission');
    }
}

但就这样,Laravel / Eloquent在PERMISSIONS表中寻找关系 . 生成类似于的选择:

SELECT * FROM PERMISSIONS WHERE PERMISSIONS.USER_ID = 1

我已经查阅了Laravel文档,发现我可以在hasOne方法中指定ForeignKey和LocalKey . 这解决了这种关系 .

但是,默认情况下,Laravel / Eloquent是否真的可以获取PERMISSIONS表中的信息?正确的一个不是用PERMISSION_ID查看USERS表吗?

@Edit

由于Alexey Mezenin的回应

我研究了hasOne和belongsTo之间的区别 . 我找到了以下答案:

What is the difference between BelongsTo And HasOne in Laravel

根据我的理解,当外键在另一个表上时,正确的是使用hasOne .

当外键在模板自己的表中时,正确的是使用belongsTo .

下次我会继续关注这些细节,感谢Alexey Mezenin和jedrzej.kurylo

1 回答

  • 1

    你的关系是倒置的,你使用 hasOne() 而不是 belongsTo . 在 User 模型中使用此关系:

    public function permission()
    {
        return $this->belongsTo(Permission::class);
    }
    

    Permission 模型中,您可能希望添加 hasOne() 关系(如果您想要使用它):

    public function user()
    {
        return $this->hasOne(User::class);
    }
    

    但通常,许多用户可以使用相同的权限 . 如果是这种情况,只需将 hasOne 更改为 hasMany .

相关问题